JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<<include "MC">> <span class="body-sens-row" style="display:flex; justify-content:center; align-items:center; gap:0.35em; margin:0.35em 0 0.2em 0;"> <span @title="'Mind Sensitivity: ' + setup.Mc.bodyPartSensitivity('brain').toFixed(1)"><<image "ui/icons/sens-mind.png" { style: "width:20px; height:20px;" }>></span> <span @title="'Boobs Sensitivity: ' + setup.Mc.bodyPartSensitivity('tits').toFixed(1)"><<image "ui/icons/sens-boobs.png" { style: "width:20px; height:20px;" }>></span> <span @title="'Ass Sensitivity: ' + setup.Mc.bodyPartSensitivity('ass').toFixed(1)"><<image "ui/icons/sens-ass.png" { style: "width:20px; height:20px;" }>></span> <span @title="'Tongue Sensitivity: ' + setup.Mc.bodyPartSensitivity('mouth').toFixed(1)"><<image "ui/icons/sens-tongue.png" { style: "width:20px; height:20px;" }>></span> <span @title="'Pussy Sensitivity: ' + setup.Mc.bodyPartSensitivity('pussy').toFixed(1)"><<image "ui/icons/sens-pussy.png" { style: "width:20px; height:20px;" }>></span> <span @title="'Anal Sensitivity: ' + setup.Mc.bodyPartSensitivity('anal').toFixed(1)"><<image "ui/icons/sens-anus.png" { style: "width:20px; height:20px;" }>></span> </span> <<include "BodyModification">><br> <<if setup.Companion.shouldRenderMini()>> <<set _comp to setup.Companion.active()>> <<if _comp.isTrans>> <<companionMini `"characters/trans/" + setup.Companion.transPicture() + ".jpg"` _comp.name>> <<else>> <<companionMini _comp.portraitPath() _comp.name>> <</if>> <</if>> <br> <span id="time"><<= setup.Time.display()>></span><br> <span id="tool-timers"><<= setup.toolTimerHudMarkup()>></span> <b><<image "ui/img/energy.png" { style: "position: relative; top: 0.375em; width:10%;" }>>Energy:</b> <<showmeter 'energy' `setup.Mc.energy() / setup.Mc.energyMax()`>> <<run setup.Mc.setSanityUp(setup.Mc.sanity().toFixed(2))>> <b><<image "ui/img/sanity.png" { style: "position: relative; top: 0.375em; width:10%;" }>>Sanity:</b> <<showmeter 'sanity' `setup.Mc.sanity() / setup.Mc.sanityMax()`>> <b><<image "ui/img/hearth.png" { style: "position: relative; top: 0.375em; width:10%;" }>>Lust:</b><<showmeter 'mclust' `setup.Mc.lust().toFixed(2) / 100`>> <b><<image "ui/icons/money.png" { style: "position: relative; top: 0.375em; width:13%; display: inline; margin: 0;" }>><<= setup.Mc.money()>> </b> <b><<image "ui/img/corruption.png" { style: "position: relative; top: 0.375em; width:13%; display: inline; margin: 0;" }>> <<= setup.Mc.corruption().toFixed(2)>> <b><<image "ui/img/beauty.png" { style: "position: relative; top: 0.375em; width:11%; display: inline; margin: 0;" }>><<= setup.Mc.beauty()>></b> <b><<image "ui/icons/lvl.png" { style: "position: relative; top: 0.375em; width:11%; display: inline; margin: 0;" }>><<= setup.Mc.lvl()>></b> <br> <a class="linkselector" data-passage="Bag"><<image "ui/img/bag.png" { width: "30%" }>></a><a class="linkselector" data-passage="Notebook"><<image "ui/img/notebook.png" { width: "30%" }>></a><a class="linkselector" data-passage="Evidence"><<image "ui/img/evidence-icon.png" { width: "30%" }>></a><br> <<if setup.Gui.phoneBought()>><a class="linkselector" data-passage="Phone"><<image "ui/img/phone.png" { width: "30%" }>></a> <</if>> <div class="linkselector enterbtn"> Game [[Guide|Guide]] </div><br> <br>Ghost in M'Sheet 0.5.3c <a class="linkselector" data-passage="ChangeLog">ChangeLog</a><br>
/* Enable a single autosave slot. setup.Home.sleepAdvance writes to it on every MC sleep so players always have a fresh restore point. installAutoSaveGate() suppresses SugarCube's per-passage autosave so only sleepAdvance's explicit save reaches the slot. */ <<run Config.saves.maxAutoSaves = 1>> <<run setup.Home.installAutoSaveGate()>> <<run setup.ImagePath = "assets">> <<run setup.Game.initState()>> <<run setup.deliveryHouses = { "Honeywood Court 3": "house1.jpg", "Onyx Place 10": "house2.jpg", "Star Street 25": "house3.jpg", "Lilac Lane 72": "house4.jpg", "Emerald Street 17": "house5.jpg", "Cascade Avenue 56": "house6.jpg", "Jasmine Lane 89": "house7.jpg", "Golden Road 34": "house8.jpg", "Twilight Boulevard 61":"house9.jpg", "Amethyst Street 42": "house10.jpg" }>> <<run setup.deliveryStreets = Object.keys(setup.deliveryHouses)>> <<run setup.piercingList = [ { var: "earsPiercing", img: "earspiercing.jpg", target: "Ears", tip: "Pierced ears", icon: "ears.png", beauty: 2 }, { var: "nosePiercing", img: "nosepiercing.jpg", target: "Nose", tip: "Pierced nose", icon: "nose.png", beauty: 3 }, { var: "tonguePiercing", img: "tonguepiercing.jpg", target: "Tongue", tip: "Pierced tongue", icon: "tongue.png", sensVar: "piercingTongueAddSens", lustVar: "addLustPiercingTongue" }, { var: "titsPiercing", img: "titspiercing.jpg", target: "Tits", tip: "Pierced nipples", icon: "tits.png", sensVar: "piercingTitsAddSens", lustVar: "addLustPiercingTits" }, { var: "pussyPiercing", img: "pussypiercing.jpg", target: "Pussy", tip: "Pierced pussy", icon: "vagina.png", sensVar: "piercingPussyAddSens", lustVar: "addLustPiercingPussy" } ]>> <<run setup.deliveryMapLayout = [ "Honeywood Court 3", "", "Onyx Place 10", "", "Star Street 25", "", "Lilac Lane 72", "Emerald Street 17", "", "", "", "Cascade Avenue 56", "", "Jasmine Lane 89", "Golden Road 34", "Twilight Boulevard 61","", "Amethyst Street 42", "", "" ]>> /* Meter definitions. SugarCube's <<newmeter>> needs literal label strings that reference state variables; these are internal bindings the framework evaluates on each render, not reads performed by passage logic. They live here because <<newmeter>> must be called from StoryInit. The per-room search<Room><Tool> meters and the sidebar HUD meters (mclust / companionsanity / companionlust / ghostlust) are registered via Meter.add from their owning controllers — see ToolController.js and the *Controller.tw files for each domain. */ <<newmeter 'energy'>> <<sizing '220px'>> <<colors #d8f22c>> <<label '$mc.energy'>> <</newmeter>> <<newmeter 'sanity'>> <<sizing '220px'>> <<label '$mc.sanityUp'>> <</newmeter>> <<newmeter 'xpBar' setup.Mc.exp()>> <<label '$percentageOfLevel %'>> <<colors 'green'>> <<sizing '50%' 20px>> <<animation 2s swing>> <</newmeter>>
<<image "ui/img/church.jpg" { width: "100%" }>> @@.location; Church@@<br> @@.mc-thoughts; You are standing in front of an old church. Near the entrance, there is a fountain with crystal-clear water. The church is a place of tranquility and humility. Here, one can find solace and peace, achieve inner harmony and worship. Perhaps I should visit here more often.@@<br> <br> <<if not setup.Church.isOpen()>> @@.mc-thoughts; I came at an inappropriate time (open from 6 AM to 10 PM)@@<br> <<else>> <<if setup.Church.canStartNunQuest()>> @@.enterbtn;<<link "Confess your sins" "ChurchNunQuest">><<run setup.Church.clearRescueQuest()>> <</link>>@@ <<else>> @@.enterbtn;[[Confess your sins|ChurchPray]]@@<br> <</if>> <</if>> <<if setup.Church.showMissingPersonsBoard()>> @@.enterbtn; [[Missing persons board|RescueTaskBoard]]@@<br> <</if>> <br> <<if setup.Church.holyWaterAvailable()>> @@.usebtn; <<linkreplace "Take holy water">> <<run setup.Church.collectHolyWater()>> @@.mc-thoughts; Now you have holy water in your bag.@@ <</linkreplace>>@@ <</if>> <br> <br> @@.backbtn;[[Leave|CityMap]] @@ <<if previous(2) is "Church">><<addTime 0.5>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 0.5>><</if>>
<<image "ui/img/church-basement.jpg" { class: "displayCentredImgs", width: "100%" }>><br> @@.mc-speech; I heard she went in here... but it seems the door is locked.<br> Well, there's nothing I can do.<br> Guess I'll have to [[go back home|Sleep]]<br>@@
<<image "characters/rescue/rain.jpg" { class: "displayCentredImgs", width: "50%" }>><br> <<if not setup.Church.hasMetRain()>> <<run setup.Church.initRainIfNeeded()>> @@.notmc-speech; <<= setup.Mc.name()>>, hey. I'm Rain. The witch told me about you. Thanks for agreeing to help.@@<br> @@.mc-speech; Of course. Though it's kind of strange that you know a witch.@@<br> @@.notmc-speech; Well, she used to serve the church but left the order for some reasons.@@<br> @@.mc-speech;An order?@@<br> @@.notmc-speech; We help people who are haunted by them, day after day. Sometimes we just perform cleansing rituals, and sometimes we have to do an exorcism. Basically, we're doing what you do, but with an organization behind it.@@<br> @@.mc-speech;Sounds interesting. Can I join?@@<br> @@.notmc-speech; Not right now. But if you prove yourself to be a good ghost hunter, we might consider it.@@<br> @@.mc-speech; Alright, but I'm here for something else. Tell me about the missing girls.@@<br> @@.notmc-speech; Listen closely. There's a board with photos of the missing girls right outside the church. It has their names and pictures. <br><em><b>We update it every day at 6 PM</b></em>, since some girls get found and some stay missing.<br><br> If you want to help, just take one of the posters from the board.<br> Now, about where to look: there are lots of old, abandoned houses in the southern part of the city. Most of the missing girls end up there, but none of them originally went that way. They went to places on Owaissa Street or Elm Street and somehow ended up south.<br><br> <em><b>You've got two options: either head straight south and search every house, which will take a while, or start on Owaissa or Elm and try to find clues that point to a specific house in the south.</b></em><br> But remember, you've got limited time. <em><b>You need to find the girl by 6 PM the next day.</b></em> After that, it's too late, and we'll have to send in more experienced hunters.<br><br> <em><b>And one more thing: the longer the girl stays missing, the worse things could get. Take a bottle of holy water, just in case.</b></em>@@<br> @@.mc-speech; Alright, I think I got it. Thanks.@@<br> <br> @@.mc-action; Now I can assist Rain in the search for the missing girls.@@<br> <</if>> <<run setup.Church.clearRescueClue()>> <<if setup.MissingWomen.rescueQuestStage() eq 2>> @@.notmc-speech; This is bad, I'll have to send an experienced ghost hunter to search for her, even though I have very few people available.@@<br> <<if setup.Church.relationshipWithRain() eq 0>> <<else>> <<run setup.Church.adjustRainRelationship(-1)>> @@.mc-thoughts; Your relationship with Rain has decreased - <<= setup.Church.relationshipWithRain()>>.@@ <</if>> <<elseif setup.MissingWomen.rescueQuestStage() eq 3>> @@.notmc-speech;Oh, <<= setup.Mc.name()>>, I've already been informed that you found our girl, thank you so much. You've been a great help to me, thank you.<br>@@ <<if setup.Church.upgradeSpiritboxReward()>> @@.notmc-speech;I hope you'll be able to keep helping us. <br> I don't have anything to give you in return for your help right now, but maybe I can repay you somehow later.@@<br> @@.mc-action; You get a lvl 3 Spiritbox @@<<image "ui/img/spiritbox.png" { style: "max-width:5%" }>><br><br> <</if>> <<run setup.Church.adjustRainRelationship(1)>> @@.mc-thoughts; Your relationship with Rain has increased - <<= setup.Church.relationshipWithRain()>> now!@@<br> <</if>> <br><br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> @@.backbtn; [[Back|Church][setup.Church.clearRescueQuest()]]@@<br>
<<image "scenes/church/1.jpg" { width: "100%" }>><br> @@.notmc-speech; Bless you, my daughter. How may I assist you?@@<br> <<if setup.Church.canRequestExorcism()>> @@.enterbtn; [[I need to talk to Rain|RainExorcism]]@@<br> <</if>> <<if setup.Church.shouldRedirectToNunQuest()>> <<goto "ChurchNunQuest">> <</if>> <<if setup.Church.canFlirtWithPriest()>> <<linkreplace "@@.usebtn;Flirt with him@@">> <<if setup.Church.priestSexOnCooldown()>> @@.notmc-speech; Enough for today, come to me tomorrow @@ <<elseif setup.Church.meetsBeautyForFlirt()>> @@.mc-speech; I didn't come for a confession...I want to feel your [[big hard cock inside me|ToolsEventChurch]]@@<br> <<else>> @@.notmc-speech; I have a lot to do...maybe later@@<br> @@.warningtext; (Req. <<statIcon setup.StatIcon.BEAUTY>> ≥ 45)@@ <</if>> <</linkreplace>><br> <</if>> <<linkreplace "@@.usebtn;Start confession with a priest@@">> @@.mc-speech; Bless me, father. I feel that I haven't always been fair and kind to others. Sometimes I've harbored anger and resentment@@<br> @@.notmc-speech; Thank you for your sincere confession. Remember, the Lord is always ready to forgive if you sincerely repent of your sins. Accept correction and strive for virtue@@<br> @@.mc-speech; Thank you, father. I will pray and endeavor to be better@@<br> @@.notmc-speech; May the peace and grace of the Lord be with you. Go in peace, my daughter@@<br> <br> Your <<statIcon setup.StatIcon.HEALTH>> is decreased <<run setup.Church.clearLust()>> <</linkreplace>> <br> <<if setup.Church.canAskAboutLevel3Tools()>> <<linkreplace "@@.usebtn;Ask about level 3 tools@@">> @@.mc-speech;I wanted to ask you something. I was told that you have one of the level 3 tools for detecting ghosts. I would really like to get it, I really need it@@<br> <<if setup.Church.meetsBeautyForLevel3Tools()>> <<if setup.Church.priestWillTradeToolForSex()>> @@.notmc-speech;Yes, I have a level 3 thermometer. Of course, I understand that this item is very valuable. This thing is for real professionals. I could give it to you, but I'd like to get something [[in return...|ToolsEventChurch]]@@<br> <<else>> @@.notmc-speech;Yes, i have a level 3 thermometer. Of course, I understand that this item is very valuable. This thing is for real professionals. It's not often that beautiful girls like you come here. I could give it to you, but I'd like to get something in return...@@<br> @@.mc-thoughts; What the fuck. This is a priest, why does he hint at such things, well, no, this is not for me.@@<br> @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 4)@@ <</if>> <<else>> @@.notmc-speech;Yes, I have a level 3 thermometer, but I don't think I can trust you with it, sorry@@<br> @@.mc-thoughts; Damn! I really need this thing. What should I do to get his attention?@@<br> @@.warningtext; (Req. <<statIcon setup.StatIcon.BEAUTY>> ≥ 45)@@ <</if>> <</linkreplace>> <</if>> <br> <br> @@.backbtn;[[Leave|CityMap]] @@<br>
<<image "characters/rescue/rain.jpg" { class: "displayCentredImgs", width: "50%" }>><br> @@.mc-speech; Hi, Rain. A witch told me you could help me...@@<br> <<if setup.Church.rainTrustsForExorcism()>> @@.notmc-speech; Yes, of course. You've helped me before, and I'm ready to assist you. What's the matter?@@<br> @@.mc-speech; There's some kind of ghost or entity in my house. It's been there for a while, unlike the others, which would leave... once they got what they wanted.@@<br> @@.notmc-speech; If it doesn't leave, it's more complicated. Holy water won't help...<br> I think an exorcism is necessary. Here's what we can do: I'll give you a book that will allow you to summon this entity. Once it appears, you'll need to recite a spell from the book. That should make it disappear.<br>@@ @@.mc-speech; That sounds too easy.@@<br> @@.notmc-speech; There are some... nuances: you must ensure no one else is in the house when you do this, or you might summon the wrong spirit...@@<br> @@.mc-speech; Uh... How can I be sure of that? What if I'm not even aware there's a ghost in my house?<br>@@ @@.notmc-speech; I'll give you an amulet - it's made from a special material. If there's any entity in your home, the amulet will grow warm and change color. If there's nothing, it'll remain unchanged.@@<br> @@.mc-speech; Oh, thank you. I'll do my best to get rid of this entity.@@<br> @@.notmc-speech; Unfortunately, I can't help directly. This ghost seems to be connected to you in some way, and my interference might complicate things. You must do this alone.@@<br> @@.mc-speech; Understood. Thanks again.@@<br> @@.notmc-speech; Good luck.@@<br><br> @@.mc-action; I need to summon a ghost in my house using the book Rain gave me@@<br> <<run setup.Church.startExorcismQuest()>> <<else>> @@.notmc-speech; I'm sorry, I'm swamped right now - I need to find some missing nuns. If you help me with this, I'll be glad to assist you in return. You know what to do, so come back to me once you've helped me find a few of my girls.@@<br> @@.mc-speech; Alright.@@<br> @@.mc-thoughts; I need to help her <<print setup.Church.rescuesNeededForExorcism()>> more times.@@<br> <</if>> <br> @@.backbtn; [[Leave|Church]] @@<br>
<<image "characters/rescue/rain.jpg" { class: "displayCentredImgs", width: "50%" }>><br> @@.mc-thoughts; Rain looks at Brooke and calmly says@@<br> @@.notmc-speech; Don't worry, I'll help her. Everything will be fine. But you should go home and get some rest. @@<br> @@.mc-thoughts; She leads Brooke behind the church. @@<Br> <<run setup.Church.clearBrookePossession()>> <br> @@.enterbtn; [[Follow her|ChurchBasementEntrance]]@@ <b>or</b> @@.enterbtn;[[go home|Sleep]]@@<br>
<<video "scenes/church/1.mp4">> @@.mc-speech; Do you like it?@@<br> @@.notmc-speech; Yes, you are perfection, show what you can do with <<linkappend "your mouth">> <br> <<addLust 15>> <<randomVideo "scenes/church/2.mp4" "scenes/church/3.mp4">> @@.notmc-speech; Oh~keep sucking it my girl@@<br> @@.mc-speech; ~Hmng~ulrp~@@<br> @@.notmc-speech; Come on my girl, get up, I want to [[fuck you|ToolsEventChurch1]]@@<br> <</linkappend>>@@ <<addLust 15>>
<<addLust 15>> <<randomVideo "scenes/church/4.mp4" "scenes/church/5.mp4">> @@.notmc-speech; Oh~ you're so hot, I'm going to cum soon@@<br> <<if setup.Church.lustTooHighForPriest()>> @@.mc-speech; Nooo, wait, I feel like I'm going to cum, fuck me <<linkappend "in the ass, please">> <<randomVideo "scenes/church/6.mp4" "scenes/church/7.mp4">> @@.mc-speech; Fuck ~I can feel every millimeter of your huge dick in my ass, so good~@@<br> @@.notmc-speech; Oh god~ your asshole is so tight, I'm [[cumming|ToolsEventChurchEnd]]@@ <<addLust 15>> <</linkappend>>@@ <<else>> @@.mc-speech; Fuck~AH~ cum [[on my face|ToolsEventChurchEnd]]@@<br> <</if>>
<<video "scenes/church/8.mp4">> @@.mc-speech; Holy~ so much cum@@<br> <<if not setup.Church.priestToolEventStarted()>> @@.notmc-speech; I think you deserve it, here you go. If you want, you can come to me sometimes for special confessions@@<br> @@.mc-speech; Thanks, i'll think about that@@<br> <<run setup.Church.startPriestToolEvent()>> @@.mc-action; You get a lvl 3 Thermometr @@<<image "ui/img/thermometr.png" { style: "max-width:5%" }>> <br> <br> <<else>> @@.notmc-speech; You are the best. I need to go now, bye@@<br> <</if>> <<run setup.Church.confessFlushLust()>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <<run setup.Church.startChurchSexCooldown()>> <<gainXP 10 0.5>> @@.backbtn;[[Leave|CityMap]]@@ <br>
<<widget "randomVideo">> <<set _rv to random(1, _args.length - 1)>> <<set _rvPath to _args[_rv]>> <<video _rvPath>> <</widget>> <<widget "gainXP">> <<set _xpAmount to _args[0]>> <div class="wrapperGain"> <span>You gain:</span><br> <span>Experience: +_xpAmount exp</span><br> <<if _args[1]>> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(_args[1])>> <span><<statIcon setup.StatIcon.CORRUPTION>>: +_args[1] </span> <</if>> <</if>> <span class="reachedNewLvl"></span><br> </div> <span id="expBar"><<showmeter 'xpBar'>></span><br> <<set _leveled to setup.Mc.grantExp(_xpAmount)>> <<updatemeter 'xpBar' `setup.Mc.exp() / setup.Mc.neededForNextLevel()`>> <<if _leveled>> <<done>> <<replace ".reachedNewLvl">>You reached a new level - <<= setup.Mc.lvl()>> ! <</replace>> <</done>> <<updatemeter 'xpBar' `setup.Mc.exp() / setup.Mc.neededForNextLevel()`>> <</if>> <</widget>> <<widget "randomVideoFromList">> <<set _rvList to _args[0]>> <<set _rvIdx to random(0, _rvList.length - 1)>> <<set _rvSelected to _rvList[_rvIdx]>> <<video _rvSelected>> <</widget>>
<<set _pick to setup.Companion.pickEventMedia()>> <<if _pick and _pick.type eq "video">> <<video _pick.src>> <<elseif _pick>> <<if setup.Companion.isTransCompanion()>> <<image _pick.src { class: "displayCentredImgs", alt: "Image" }>><br> <<else>> <<image _pick.src { width: "100%", alt: "Image" }>><br> <</if>> <</if>> <<set _tier to setup.Companion.eventSanityTier()>> <<set _lvl to setup.Companion.activeCompanionLvl()>> <<if _tier is 1>> <<companionTextEvent 1>> <<isCompanionContinue _lvl 2 75 100>> <<elseif _tier is 2>> <<companionTextEvent 2>> <<isCompanionContinue _lvl 3 50 75>> <<elseif _tier is 3>> <<companionTextEvent 3>> <<isCompanionContinue _lvl 4 25 50>> <<elseif _tier is 4>> <<companionTextEvent 4>> <<isCompanionContinue _lvl 6 1 25>> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
@@.mc-thoughts; Time is passing, but your friend still hasn't returned. You listen carefully, but all you can hear is your own breathing. Your companion should have been back by now.@@<br> @@.mc-speech; What if the ghost attacked? Maybe my help is needed.<br> I need to find my friend, and the sooner, the better. Maybe I can make it in time and nothing will happen... @@<br> <br> [[Continue|$return]]<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
@@.notmc-speech; <<= setup.Mc.name()>>, wait, I don't feel well... This place is driving me crazy, I don't feel like myself."@@<br> @@.mc-thoughts; She nervously looks around, as if afraid the ghost might return at any moment.@@<br> @@.notmc-speech; I'm sorry, but I can't stay with you. I have to get out of here, or I'll break...@@<br> @@.mc-speech; Yes, of course, I understand.@@<br> <br> @@.mc-thoughts; <<= setup.Companion.name()>> leaves the house.@@ <<if setup.Companion.sanity() lte 0>> <<else>>@@.warningtext; Req. higher level of <<= setup.Companion.name()>> .@@ <</if>><br> @@.mc-speech; Well, I'm alone now...@@<br> <br> <<run setup.Companion.resetHuntState()>> @@.backbtn; [[Continue|$return]]@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* Shared Main screen for all six companions: portrait, clothing-tier links, plan selection, walk-home. Per-companion text, image paths, and walk-home eligibility come from setup.Companion's catalogue; chance-to-attack lives on the companion stat object itself, accessed through setup.Companion.chanceToAttack(). */ <<set _cname to setup.Companion.name()>> <<set _c to setup.Companion.getByName(_cname)>> <<set _state to _c.state()>> <<run setup.Companion.ensureChanceToAttack()>> <div class="flexwrapperCompanionMain"> <div class="companionImageMain"> <<do>> <<image _c.imagePath(setup.Companion.chanceToAttack()) { width: "100%" }>><br> <</do>> </div> <div class="companionTextMain"> <span style="color: yellow; font-weight: bold; font-size: 1.2em;"><<= _state.name>> :</span> <<if _c.hasExpSystem>> <<= _state.lvl>> lvl <<if _state.lvl gte 5>> (max. lvl) <<else>> (<<= _state.exp>> / <<= _state.expForNextLvl>>) <</if>> <</if>><br> @@.mc-thoughts; I could ask <<= _c.pronObj>> to take off some of <<= _c.pronPos>> clothes. Maybe that way I could distract the ghost by drawing its attention to <<= _c.pronObj>>. Plus, it would make it easier for <<= _c.pronObj>> to move and stay less distracted...@@<br> @@.mc-speech; <br> <<link "You'll be more comfortable in your regular clothes.">> <<run setup.Companion.setChanceToAttack(25)>> <<redo "companionAnswers">><<redo>> <</link>><br> <div class="companionLvlCheck1"> <<link `_c.clothingTiers[0].mc`>> <<run setup.Companion.setChanceToAttack(_c.tierChance(0))>> <<redo "companionAnswers">><<redo>> <</link>> <<if _state.lvl lt 1>> @@.warningtext; (Req. lvl 1+)@@ <</if>> <br> </div> <div class="companionLvlCheck2"> <<link `_c.clothingTiers[1].mc`>> <<run setup.Companion.setChanceToAttack(_c.tierChance(1))>> <<redo "companionAnswers">><<redo>> <</link>> <<if _state.lvl lt 2>> @@.warningtext; (Req. lvl 2+)@@ <</if>> <br> </div> <div class="companionLvlCheck3"> <<link `_c.clothingTiers[2].mc`>> <<run setup.Companion.setChanceToAttack(_c.tierChance(2))>> <<redo "companionAnswers">><<redo>> <</link>> <<if _state.lvl lt 3>> @@.warningtext; (Req. lvl 3+)@@ <</if>> <br> </div> <div class="companionLvlCheck4"> <<link `_c.clothingTiers[3].mc`>> <<run setup.Companion.setChanceToAttack(_c.tierChance(3))>> <<redo "companionAnswers">><<redo>> <</link>> <<if _state.lvl lt 4>> @@.warningtext; (Req. lvl 4+)@@ <</if>> <br> </div> @@ <br> <<do tag "companionAnswers">> @@.notmc-speech;<<= setup.Companion.getByName(_cname).responseFor(setup.Companion.chanceToAttack())>>@@ <</do>><br> @@.warningtext; Chance of ghost encounter: <<do>><<= setup.Companion.chanceToAttack()>> % <</do>>@@<br> <br> </div> </div> @@.notmc-speech; Oh~, I'm feeling a bit nervous. What's our plan?@@<br> <br> <<sanityPills>> <br> @@.usebtn;<<link "Let's stick together for now">> <<run setup.Companion.setStayTogetherPlan()>> <<replace "#compResponse">> @@.notmc-speech;Good, I'll stay close to you.@@ <</replace>> <</link>>@@<br> <span id="checkQuestForCursedItem">@@.usebtn;<<link `"I need you to find the cursed item @@.warningtext; (" + State.variables.companion.chanceOfSuccessCI + " %, " + State.variables.companion.plan2TimeReq + " min)@@"`>> <<if not setup.Companion.hasCursedItem()>> <<run setup.Companion.setHuntPlan("Plan2", State.variables.companion.chanceOfSuccessCI, State.variables.companion.plan2TimeReq)>> <<replace "#compResponse">> @@.notmc-speech;Alright, I'll look for the cursed item.@@ <</replace>> <<else>> <<replace "#compResponse">> @@.notmc-speech; We already have a cursed item.@@ <</replace>> <</if>> <</link>>@@</span> <<if not setup.Companion.cursedItemQuestUnlocked()>>@@.warningtext; Req. quest from the witch@@ <</if>><br> @@.usebtn;<<link `"I want you to look for any ghost evidence @@.warningtext; (" + State.variables.companion.chanceOfSuccessAnyEvidence + " %, " + State.variables.companion.plan3TimeReq + " min@@)"`>> <<run setup.Companion.setHuntPlan("Plan3", State.variables.companion.chanceOfSuccessAnyEvidence, State.variables.companion.plan3TimeReq)>> <<replace "#compResponse">> @@.notmc-speech;Sure, I'll search for any ghost evidence.@@ <</replace>> <</link>>@@<br> @@.usebtn;<<link `"It would be nice if you found the ghost's favorite room @@.warningtext; (" + State.variables.companion.chanceOfSuccessGR + " %, " + State.variables.companion.plan4TimeReq + " min@@)"`>> <<run setup.Companion.setHuntPlan("Plan4", State.variables.companion.chanceOfSuccessGR, State.variables.companion.plan4TimeReq)>> <<replace "#compResponse">> @@.notmc-speech; Got it, I'll try to find the ghost's favorite room.@@ <</replace>> <</link>>@@<br> <<if _c.canWalkHome and setup.Ghosts.isHunting()>> @@.usebtn;<<link `"Ask " + _c.pronObj + " to walk you home."`>> <<replace "#compResponse">> @@.mc-speech; I think that's enough. Can you walk me home, please?@@<br> <<if setup.Companion.canWalkHomeWithCompanion()>> @@.notmc-speech; Of course. Are you sure you want to leave now?@@<br> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.companionHuntPassage and setup.Ghosts.isHunting()>> @@.mc-speech; Yes, <<link "let's go together" `_hg.companionHuntPassage`>> <</link>> @@ <<else>> @@.mc-speech; Yes, [[let's go together|WalkHomeTogether]] @@ <</if>> <b>or </b> <<linkreplace "@@.mc-speechLink; Not yet@@">> @@.notmc-speech; Alright, so what should we do?@@ <</linkreplace>><br> <<else>> @@.notmc-speech;Um... Well, maybe you should find your clothes first...?@@<br> <<if setup.Mc.exhibitionism() lte 4 or setup.Mc.exhibitionism() is undefined>>@@.mc-speech; Yeah, you're right.@@@@.warningtext; (She'll go with you if you're dressed) or Req. Exhibitionism Level 5+@@ <</if>> <<if setup.Mc.exhibitionism() gte 5>> <<linkreplace "@@.mc-speechLink; I don't care@@">> <<if hasVisited("NudityEventTwo")>> @@.mc-speech;Let's just leave naked, like last time...@@<br> @@.notmc-speech; Alright, but I'm still grabbing some bathrobes...@@<br> <br> @@.backbtn; [[Go home together naked|NudityEventTwo]]@@<br> <<else>> @@.mc-speech; I don't care. I just want to get out of here as soon as possible. Besides, I've walked down the street naked before... It's actually kind of fun. People's eyes wander over you, and the breeze gently tickles all your intimate places~ <br> It might feel awkward at first, but after a couple of minutes, you'll start to enjoy it...<br> Come on! Let's go naked together.You'll like it.<br>@@ @@.notmc-speech; Wow, you're such a slut. Alright, let's go. But I'll still grab some clothes from here for us. That way, I'll feel more comfortable.@@<br> <br> @@.backbtn; [[Go home together naked|NudityEventTwo]]@@<br> <</if>> <</linkreplace>> <</if>> <</if>> <</replace>> <</link>>@@ <</if>><br> <span id="compResponse"></span> <br> <br> @@.backbtn; [[Continue|previous()]]@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <<if not setup.Companion.cursedItemQuestUnlocked()>> <<addclass "#checkQuestForCursedItem" "disabled-link">> <</if>> <<set _stateLvl to setup.Companion.getByName(_cname).state().lvl>> <<for _j to _stateLvl; _j lt setup.Companion.getByName(_cname).tierCount(); _j++>> <<addclass `".companionLvlCheck" + (_j + 1)` "disabled-link">> <</for>> <</done>>
<<set _cName to setup.Companion.name()>> <<if State.variables.chosenPlan eq "Plan2">> <<if setup.Companion.hasCursedItem()>> @@.notmc-speech; It seems you managed to find the cursed object faster than me, well done.@@<br> @@.notmc-speech; But why did you send me to look for it if you started searching for it yourself?@@<br> @@.notmc-speech; Actually, nevermind, let's continue.@@<br> <<else>> @@.notmc-speech; I'm sure@@ <<linkappend "@@.notmc-speechLink; it's a cursed item...@@">> <br> <<set _found to setup.Companion.rollFoundCursedItem()>> @@.mc-speech; <<= _found.speech>>@@<br> <<image _found.img { width: "30%" }>> <br> <</linkappend>> <br>@@.mc-speech; Well, we'll have to take this to the witch.@@<br> @@.mc-thoughts; She definitely took longer than expected finding that item... I think I know what kept her for so long...<br> As soon as I thought about it, I started to feel more... aroused<br>@@ +30 <<statIcon setup.StatIcon.HEALTH>><br><<addLust 30>> <br> @@.mc-action; <<= _cName>> found the cursed item!@@<br> <br> <<companionExp 10>> <</if>> <<elseif State.variables.chosenPlan eq "Plan3">> <<set _randomEvidence to setup.Companion.pickRandomHuntEvidence()>> <<if _randomEvidence eq "emf">> @@.notmc-speech; evidence - EMF 5 @@ <<image "ui/img/emf.png" { style: "position: relative; top: 0.375em; width:5%;" }>><br> <br> @@.mc-action; <<= _cName>> found the evidence! @@<br> <br> <<companionExp 5>> <<elseif _randomEvidence eq "gwb">> @@.notmc-speech; evidence - Ghost Writing Book @@ <<image "ui/img/gwb.png" { style: "position: relative; top: 0.375em; width:5%;" }>><br> @@.notmc-speech; Do you want to see this?@@<br> <<image setup.Companion.pickGwbImage() "evidenceImgs">> <br> <br> @@.mc-action; <<= _cName>> found the evidence!@@<br> <br> <<companionExp 5>> <<elseif _randomEvidence eq "temperature">> @@.notmc-speech; evidence - High Temperature @@ <<image "ui/img/thermometr.png" { style: "position: relative; top: 0.375em; width:5%;" }>><br> <br> @@.mc-action; <<= _cName>> found the evidence!@@<br> <br> <<companionExp 5>> <<elseif _randomEvidence eq "spiritbox">> @@.notmc-speech; evidence - Spirit Box @@ <<image "ui/img/spiritbox.png" { style: "position: relative; top: 0.375em; width:5%;" }>><br> <br> @@.mc-action; <<= _cName>> found the evidence!@@<br> <br> <<companionExp 5>> <<elseif _randomEvidence eq "uvl">> @@.notmc-speech; evidence - UVL @@ <<statIcon setup.StatIcon.UVL>><br> <br><br> @@.mc-action; <<= _cName>> found the evidence!@@<br> <br> <<companionExp 5>> <<elseif _randomEvidence eq "glass">> @@.notmc-speech; evidence - Ectoglass@@ <<image "ui/img/glass.png" { style: "position: relative; top: 0.375em; width:5%;" }>><br> <br> @@.mc-action; <<= _cName>> found the evidence!@@<br> <br> <<companionExp 5>> <</if>> <<elseif State.variables.chosenPlan eq "Plan4">> @@.notmc-speech; the ghost's favorite room -- it's <<ghostRoom>>@@<br> <br> @@.mc-action; <<= _cName>> found the ghost's favorite room!@@<br> <br> <<companionExp 5>> <</if>> <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* Reached only when the single mission roll in setup.Tick.resolveCompanionAttack landed safe (showComp = ATTACK_SAFE), so the success path is unconditional here — no second roll. */ <<set _portrait to setup.Companion.outcomePortrait(true)>> <<if setup.Companion.isTransCompanion()>> <<image _portrait "displayCentredImgs">><br> <<else>> <<image _portrait { width: "50%" }>><br> <</if>> <<if State.variables.chosenPlan eq "Plan2" and setup.Companion.hasCursedItem()>> <<include "CompanionResult">> <br> @@.mc-speech; Yeah, let's just [[continue|$return]]@@<br> <<else>> @@.notmc-speech; Hey! I have great news, I found...@@<br> <<include "CompanionResult">> <br> @@.mc-speech; Yeah, great job. Let's [[keep going.|$return]]@@<br> <</if>> <<run setup.Companion.acknowledgeCompanionResult()>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<div class="flexwrapper addGap5"> <div class="housecard"> <<if setup.Companion.hasMetBrook()>> <<set _brook to setup.Companion.stateFor("brook")>> @@.notmc-speech; <<= _brook.name>> @@<br> <<= _brook.lvl>> lvl <<if _brook.lvl gte 5>> (max. lvl) <<else>>(<<= _brook.exp>> / <<= _brook.expForNextLvl>>) <</if>><br> <<image "characters/brook/brook.png" "contactsImages">><br> <<if setup.Time.hours() lte 5>> <<if setup.Companion.hasFinishedSoloHunt("Brook")>> @@.mc-thoughts; She is currently on a ghost hunt.@@ <<else>> @@.mc-thoughts; She's sleeping@@<br> <</if>> <<else>> <<if setup.Library.brookIsPossessed()>> <<linkreplace "@@.enterbtn;Text her@@">>She's not answering... Strange, she usually responds right away... <</linkreplace>> <<else>> <<if setup.Companion.isBrookeCurrentlyUnavailable()>> @@.mc-thoughts;She's probably still with Rain. Maybe it's worth waiting a couple of days. @@ <<else>> @@.enterbtn;[[Text her|BrookInfo]]@@<br> <</if>> <</if>> <</if>> <<else>> @@.mc-thoughts; Need to search in the library@@<br> <<image "ui/img/question-mark.png" "contactsImages">> <</if>> </div> <div class="housecard"> <<if setup.Companion.hasMetAlice()>> <<set _alice to setup.Companion.stateFor("alice")>> @@.notmc-speech; <<= _alice.name>> @@<br> <<= _alice.lvl>> lvl <<if _alice.lvl gte 5>> (max. lvl) <<else>>(<<= _alice.exp>> / <<= _alice.expForNextLvl>>) <</if>><br> <<image "characters/alice/alice.png" "contactsImages">><br> <<if setup.Time.hours() lte 5>> <<if setup.Companion.hasFinishedSoloHunt("Alice")>> @@.mc-thoughts; She is currently on a ghost hunt.@@ <<else>> @@.mc-thoughts; She's sleeping@@<br> <</if>> <<else>> @@.enterbtn;[[Text her|AliceInfo]]@@<br> <</if>> <<else>> @@.mc-thoughts; Deliver books to the correct address@@<br> <<image "ui/img/question-mark.png" "contactsImages">> <</if>> </div> <div class="housecard"> <<if setup.Companion.blakeUnlocked()>> <<set _blake to setup.Companion.stateFor("blake")>> @@.notmc-speech; <<= _blake.name>> @@<br> <<= _blake.lvl>> lvl <<if _blake.lvl gte 5>> (max. lvl) <<else>>(<<= _blake.exp>> / <<= _blake.expForNextLvl>>) <</if>><br> <<image "characters/blake/blake.png" "contactsImages">><br> <<if setup.Time.hours() lte 5>> <<if setup.Companion.hasFinishedSoloHunt("Blake")>> @@.mc-thoughts; She is currently on a ghost hunt.@@ <<else>> @@.mc-thoughts; She's sleeping@@<br> <</if>> <<else>> @@.enterbtn;[[Text her|BlakeInfo]]@@<br> <</if>> <<else>> @@.mc-thoughts; Befriend the assistant at the sex shop <br>(Relationship 5+)@@<br> <<image "ui/img/question-mark.png" "contactsImages">> <</if>> </div> </div> <br> @@.backbtn; [[Back|Use PC]]@@<br>
<<set _videoToggle to true>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.walkHomePassage>> <<image "ui/img/mchouse.jpg" { width: "100%" }>> @@.notmc-speech; I have a strange feeling. Like something is following us...@@<br> @@.mc-speech;I didn't see anyone. Maybe you should stay at my place then?@@<br> @@.notmc-speech; Yes, if you don't mind.@@<br><br> @@.backbtn; <<link "Sleep together" `_hg.walkHomePassage`>> <</link>>@@ <<else>> <<if setup.Companion.name() eq "Brook">> <<if setup.Companion.lust() gte 50>> <<video "characters/brook/home/1.mp4">> @@.mc-thoughts;As soon as you walked in, she pounced on you and started kissing you@@<br> @@.notmc-speech; I'm so turned on, <<= setup.Mc.name()>>. I want you right now.@@<br> @@.mc-thoughts; Her eagerness instantly aroused you, making your nipples harden, and your pussy crave attention.@@<br> @@.mc-speech; Yes~ let's do it. @@<br> @@.notmc-speech; I have something special for us. Here, let's use @@ <<linkappend "@@.notmc-speechLink; this strap-on.@@">><br> <span id ="walkhomebrook"> <<video "characters/brook/home/2.mp4">></span> @@.mc-thoughts; You took turns pleasuring <<link "@@.usebtn;each other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomebrook">> <<if _videoToggle>> <<video "characters/brook/home/2.mp4">> <<else>> <<video "characters/brook/home/3.mp4">> <</if>> <</replace>> <</link>> with the strap-on until you were both completely spent.@@<br> @@.notmc-speech; That was amazing.@@<br> @@.mc-speech;Yeah~@@<br> @@.notmc-speech; I'm really exhausted today. You rest up, and I'll head back. Hopefully, we'll meet again.@@<br> @@.mc-speech;Alright, bye.@@<br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.1)>> +0.1 <<statIcon setup.StatIcon.CORRUPTION>><br><br> <</if>> <br> @@.backbtn; [[Sleep]]@@<br> <</linkappend>> <<else>> <<image "ui/img/mchouse.jpg" { width: "100%" }>> @@.mc-speech; We made it to my place. Thanks for walking me back@@<br> @@.notmc-speech; No problem, hope we meet again. Bye.@@<br> @@.warningtext; (Req. <<= setup.Companion.name()>>'s <<statIcon setup.StatIcon.HEALTH>> ≥ 50)@@ <br><br> @@.backbtn; [[Sleep]]@@<br> <</if>> <<elseif setup.Companion.name() eq "Alice">> <<if setup.Companion.lust() gte 50>> <<video "characters/alice/home/1.mp4">> @@.mc-thoughts;As soon as you walked in, she pounced on you and started kissing you@@<br> @@.notmc-speech; I'm so turned on, <<= setup.Mc.name()>>. I want you right now.@@<br> @@.mc-thoughts; Her eagerness instantly aroused you, making your nipples harden, and your pussy crave attention.@@<br> @@.mc-speech; Yes~ @@<<linkappend "@@.mc-speechLink; let's do it. @@">> <span id ="walkhomealice"> <<video "characters/alice/home/2.mp4">></span> @@.mc-thoughts; You took turns pleasuring <<link "@@.usebtn;each other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomealice">> <<if _videoToggle>> <<video "characters/alice/home/2.mp4">> <<else>> <<video "characters/alice/home/3.mp4">> <</if>> <</replace>> <</link>> until you were both completely spent.@@<br> @@.notmc-speech; That was amazing.@@<br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.1)>> +0.1 <<statIcon setup.StatIcon.CORRUPTION>> <</if>><br> @@.mc-speech;Yeah~Do you want to [[take a shower|AliceContinue]] with me?@@<br> <b>or</b> <br> @@.mc-speech; I'm really tired already. I think I need to get some [[sleep|Sleep]].@@<br> <</linkappend>> <<else>> <<image "ui/img/mchouse.jpg" { width: "100%" }>> @@.mc-speech; We made it to my place. Thanks for walking me back@@<br> @@.notmc-speech; No problem, hope we meet again. Bye.@@<br> @@.warningtext; (Req. <<= setup.Companion.name()>>'s <<statIcon setup.StatIcon.HEALTH>> ≥ 50)@@ <br><br> @@.backbtn; [[Sleep]]@@<br> <</if>> <<elseif setup.Companion.name() eq "Blake">> <<if setup.Companion.lust() gte 50>> <<video "characters/blake/home/1.mp4">> @@.mc-thoughts;As soon as you walked in, she pounced on you and started kissing you@@<br> @@.notmc-speech; I'm so turned on, <<= setup.Mc.name()>>. I want you right now.@@<br> @@.mc-thoughts; Her eagerness instantly aroused you, making your nipples harden, and your pussy crave attention.@@<br> @@.mc-speech; Yes~ @@<<linkappend "@@.mc-speechLink; let's do it. @@">> <span id ="walkhomeblake"> <<video "characters/blake/home/2.mp4">></span> @@.mc-thoughts; You took turns pleasuring <<link "@@.usebtn;each other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomeblake">> <<if _videoToggle>> <<video "characters/blake/home/2.mp4">> <<else>> <<video "characters/blake/home/3.mp4">> <</if>> <</replace>> <</link>> until you both [[cum at the same time.|BlakeContinue]]@@<br> <</linkappend>> <<else>> <<image "ui/img/mchouse.jpg" { width: "100%" }>> @@.mc-speech; We made it to my place. Thanks for walking me back@@<br> @@.notmc-speech; No problem, hope we meet again. Bye.@@<br> @@.warningtext; (Req. <<= setup.Companion.name()>>'s <<statIcon setup.StatIcon.HEALTH>> ≥ 50)@@ <br><br> @@.backbtn; [[Sleep]]@@<br> <</if>> <</if>> <</if>> <<run setup.Mc.bankTempCorruption()>> <<run setup.Ghosts.setHuntMode(setup.Ghosts.HuntMode.POSSESSED)>> <<run setup.resetTools()>> <<run setup.Companion.clearBlakeCursedItem()>> <<run setup.Companion.resetHuntState()>> <<run setup.Companion.resetAliceWorkIfNeeded()>>
<<set _videoToggle to true>> <<video "characters/alice/home/4.mp4">> @@.mc-thoughts;You continued kissing in the shower@@<br> @@.notmc-speech; I want you again, <<= setup.Mc.name()>>, I can't stop.@@<br> @@.mc-thoughts; The arousal surged again, and there was no turning back now.@@<br> @@.mc-speech; Oh~ yeah,@@ <<linkappend "@@.mc-speechLink;kiss my pussy@@">> <span id ="walkhomealiceshower"> <<video "characters/alice/home/5.mp4">></span> @@.mc-thoughts; You took turns pleasuring <<link "@@.usebtn; each other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomealiceshower">> <<if _videoToggle>> <<video "characters/alice/home/5.mp4">> <<else>> <<video "characters/alice/home/6.mp4">> <</if>> <</replace>> <</link>> until you were both completely spent.@@<br> @@.notmc-speech; That was amazing.@@<br> @@.mc-speech;Yeah~@@<br> @@.notmc-speech; I'm really exhausted today. You rest up, and I'll head back. Hopefully, we'll meet again.@@<br> @@.mc-speech;Alright, bye.@@<br> <br> @@.backbtn; [[Sleep]]@@<br> <</linkappend>>
<<set _checkRandomCthulion to random(1,3)>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.canTentacles and _checkRandomCthulion eq 1>> <<cthulionAbility 4>> @@.mc-thoughts; <<= setup.Companion.name()>> tries to help, and the ghost pulls back. But instead, huge tentacles crawl out from the corners of the room. Before you can react, they're all over you, wrapping tight and keeping you from moving.<br> The soft, slimy tentacles start pushing into your holes, filling them with some kind of sticky liquid. You try to focus and break free, but these things know exactly what they're doing: they tease your most sensitive spots, making your body burn with desire. Your last hope is your friend, but one look at her tells you she's already lost. Her mouth's hanging open, eyes rolling back as another orgasm hits her. The room fills with wet, slurping sounds and her sweet moans.<br> There's no point fighting it anymore. You give in to the tentacles. After a while, they finally pull back, done playing with your bodies.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.notmc-speech; What... what was that?@@<br> @@.mc-speech; I have no idea, but we need to get out of here. I can't handle another round with those things.@@<br> <br> @@.backbtn; [[Continue|previous()]]@@<br> <<else>> <<set _checkEvent to random(1,2)>> <<if _checkEvent eq 1>> <<set _check to random(1,4)>> <<if _check eq 1>> <<video "characters/alice/both1.1.mp4">> <</if>> <<if _check eq 2>> <<video "characters/alice/both1.2.mp4">> <</if>> <<if _check eq 3>> <<video "characters/alice/both1.3.mp4">> <</if>> <<if _check eq 4>> <<video "characters/alice/both1.4.mp4">> <</if>> @@.mc-thoughts; You rely on your friend. <<= setup.Companion.name()>> tries to help you, but the ghost's malevolent entity, fueled by her lust, proves too powerful. The force is overwhelming, and for a moment, reality itself seems to distort. You feel an odd sensation, as if you've slipped out of this world--suddenly, you feel like a cheap whore getting fucked along with your friend.<br> The ghost shoves its cock into your mouths alternately, almost as if it's mocking you. This goes on for a while before it vanishes.<br> You look at <<= setup.Companion.name()>>, but to your surprise, her face only shows satisfaction.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.mc-thoughts; You want to say something encouraging, but suddenly she speaks up herself.<br>@@ @@.notmc-speech; It was amaz... awful, I mean. We can't just leave it like this. We need to continue our investigation to get rid of it!@@<br> @@.mc-thoughts; You're a bit taken aback by her reaction and were about to say that getting rid of it might not be possible, as you're still just trying to identify its type, but decide to stay silent. @@<br> @@.mc-speech; Yeah, you're right.@@<br><br> @@.backbtn; [[Continue|previous()]]@@<br> <<else>> <<set _check to random(1,5)>> <<if _check eq 1>> <<video "characters/alice/both2.1.mp4">> <</if>> <<if _check eq 2>> <<video "characters/alice/both2.2.mp4">> <</if>> <<if _check eq 3>> <<video "characters/alice/both2.3.mp4">> <</if>> <<if _check eq 4>> <<video "characters/alice/both2.4.mp4">> <</if>> <<if _check eq 5>> <<video "characters/alice/both2.5.mp4">> <</if>> @@.mc-thoughts; You rely on your friend. <<= setup.Companion.name()>> tries to help you, but the ghost's malevolent entity, fueled by her lust, proves too powerful. The force is overwhelming, and for a moment, reality itself seems to distort. You feel an odd sensation, as if you've slipped out of this world--suddenly, you feel like a cheap whore getting fucked along with your friend.<br> The ghost fucks you and <<= setup.Companion.name()>> alternately.This goes on for a while before it vanishes.<br> You look at <<= setup.Companion.name()>>, but to your surprise, her face only shows satisfaction.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.mc-thoughts; You want to say something encouraging, but suddenly she speaks up herself.<br>@@ @@.notmc-speech; It was amaz... awful, I mean. We can't just leave it like this. We need to continue our investigation to get rid of it!@@<br> @@.mc-thoughts; You're a bit taken aback by her reaction and were about to say that getting rid of it might not be possible, as you're still just trying to identify its type, but decide to stay silent. @@<br> @@.mc-speech; Yeah, you're right.@@<br><br> @@.backbtn; [[Continue|previous()]]@@<br> <</if>> <</if>>
<<run setup.Companion.acknowledgeSoloHuntEnd("Alice")>> @@.mc-speech; How did your ghost hunt go?@@<br> <<set _stateChance to setup.Companion.soloOdds("Alice", setup.Companion.companionChoseOwaissa("Alice") ? "Owaissa" : "Elm")>> <<set _check to random(1,100)>> <<if _stateChance gte _check>> @@.notmc-speech; <<= setup.Mc.name()>>, I did it! I correctly identified the ghost!@@<br> <<set _resultAliceAlone to 1>> <<set _reward to setup.Companion.payoutSoloHunt("Alice")>> <span> Money: +$<<= _reward>> $ </span><br> <<else>> @@.notmc-speech; <<= setup.Mc.name()>>, I didn't succeed... But I gained valuable experience and I'll be better prepared next time!@@ <<set _resultAliceAlone to 0>> <</if>> <br> <<companionExpGain "Alice" "alice">> <br> <<linkappend "@@.mc-speechLink;Tell me more about how it went.@@">> <br> <<if setup.Companion.companionLvl("Alice") lt 3>> @@.notmc-speech; I don't want to talk about it...@@ @@.warningtext; Req. Alice's lvl ≥ 3@@ <<else>> @@.notmc-speech;Well, listen...<br> At first, things went well, of course, sometimes the ghost tried to...@@<<linkappend "@@.notmc-speechLink; scare me@@">> <<set _scareVids to ["characters/alice/alone1.1.mp4", "characters/alice/2.11.mp4", "characters/alice/2.12.mp4", "characters/alice/2.10.mp4", "characters/alice/2.0.mp4", "characters/alice/2.9.mp4", "characters/alice/2.7.mp4", "characters/alice/2.1.mp4", "characters/alice/2.4.mp4"]>> <<randomVideoFromList _scareVids>> @@.notmc-speech;But I'm not easily frightened! <br> I continued searching for evidence.<br> The ghost became more aggressive... Sometimes it tried to @@<<linkappend "@@.notmc-speechLink;chocke me@@">> <<set _chokeVids to ["characters/alice/alone2.1.mp4", "characters/alice/alone2.2.mp4", "characters/alice/alone2.3.mp4", "characters/alice/3.1.mp4", "characters/alice/3.5.mp4", "characters/alice/3.7.mp4", "characters/alice/3.10.mp4", "characters/alice/3.8.mp4", "characters/alice/3.12.mp4"]>> <<randomVideoFromList _chokeVids>> @@.notmc-speech;But I was stronger than it...<br> I was about to find the last piece of evidence when suddenly@@ <<linkappend "@@.notmc-speechLink;it appeared right in front of me.@@">> <<set _appearVids to ["characters/alice/alone3.1.mp4", "characters/alice/alone3.2.mp4", "characters/alice/4.10.mp4", "characters/alice/4.11.mp4", "characters/alice/4.4.mp4", "characters/alice/4.7.mp4", "characters/alice/4.6.mp4", "characters/alice/4.1.mp4", "characters/alice/4.8.mp4"]>> <<randomVideoFromList _appearVids>> @@.notmc-speech;I lost control... and I might have given it what it had been after from the beginning...@@<br> <<if _resultAliceAlone eq 1>>@@.notmc-speech; After it cu... weakened, I ran away. That's it. @@<br> @@.mc-speech; I knew you would succeed! Great job!@@ <<elseif _resultAliceAlone eq 0>> @@.notmc-speech;It seems I just passed out.. I woke up when it was already morning. <br> That's it.@@<br> @@.mc-speech; It's okay, you'll definitely succeed next time!@@<br> @@.notmc-speech;You're right, I need to teach it a lesson for what it did to me...@@ <</if>> <</linkappend>> <</linkappend>> <</linkappend>> <</if>> <</linkappend>> <br> <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <<run setup.Companion.setAliceWorkState(0)>> @@.backbtn; [[Back|previous()][setup.Companion.clearSoloHuntStreet("Alice")]]@@
<<run setup.Companion.refreshSoloOdds("Alice")>> <<set _alice to setup.Companion.stateFor("alice")>> <div class="flexwrapperCompanionMainInfo"> <div class="companionImageMain"> <<image "characters/alice/alice.png">> </div> <div class="companionTextMain"> <span style="color: yellow; font-weight: bold; font-size: 1.2em;"><<= _alice.name>> :</span> <<= _alice.lvl>> lvl <<if _alice.lvl gte 5>> (max. lvl) <<else>>(<<= _alice.exp>> / <<= _alice.expForNextLvl>>) <</if>><br> <<set _aws to setup.Companion.aliceWorkState()>> <<if _aws is undefined or _aws eq 0>> <<linkreplace "@@.usebtn;Help her with the work@@">> @@.notmc-speech; <<= setup.Mc.name()>>, I've sent you the documents that need to be filled out. Let me know when you're done.<br>@@ <br> @@.mc-action; You received the documents from Alice.@@<br> <<run setup.Companion.setAliceWorkState(1)>> <</linkreplace>><br> <<elseif _aws eq 1>> @@.mc-speech; I need to help Alice with her work before asking her to join the ghost hunt.@@<br> <<elseif _aws eq 2>> <<if not setup.Companion.hasFinishedSoloHunt("Alice")>> @@.notmc-speech; Thanks a lot, now I'm free and ready to join you on the ghost hunt!@@<br> <</if>> <<cisCompanionSoloPicker "Alice" "her">> <</if>> </div> </div> <br> @@.backbtn; [[Return|$return]] @@<br>
<<video "characters/blake/home/4.mp4">> @@.mc-speech; Ah~ I'm almost there...@@<br> @@.notmc-speech; Don't stop... I'm so close@@<br> @@.mc-thoughts; You both grind your pussies against each other, bringing yourselves to@@ <<linkappend "@@.mc-thoughtsLink;another orgasm@@">><br> <<image "characters/blake/home/end.jpg" { width: "100%" }>><br> @@.notmc-speech; That was amazing.@@<br> @@.mc-speech;Yeah~@@<br> @@.notmc-speech; I'm really tired already. Do you mind if I stay the night? I'll try not to wake you in the morning.@@<br> @@.mc-speech; Of course, [[sweet dreams|Sleep]].@@<br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.1)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br><br> <</if>> <</linkappend>><br>
<<set _checkRandomCthulion to random(1,3)>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.canTentacles and _checkRandomCthulion eq 1>> <<cthulionAbility 4>> @@.mc-thoughts; <<= setup.Companion.name()>> tries to help, and the ghost pulls back. But instead, huge tentacles crawl out from the corners of the room. Before you can react, they're all over you, wrapping tight and keeping you from moving.<br> The soft, slimy tentacles start pushing into your holes, filling them with some kind of sticky liquid. You try to focus and break free, but these things know exactly what they're doing: they tease your most sensitive spots, making your body burn with desire. Your last hope is your friend, but one look at her tells you she's already lost. Her mouth's hanging open, eyes rolling back as another orgasm hits her. The room fills with wet, slurping sounds and her sweet moans.<br> There's no point fighting it anymore. You give in to the tentacles. After a while, they finally pull back, done playing with your bodies.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.notmc-speech; What... what was that?@@<br> @@.mc-speech; I have no idea, but we need to get out of here. I can't handle another round with those things.@@<br> <br> @@.backbtn; [[Continue|previous()]]@@<br> <<else>> <<set _checkEvent to random(1,2)>> <<if _checkEvent eq 1>> <<set _check to random(1,4)>> <<if _check eq 1>> <<video "characters/blake/both1.1.mp4">> <</if>> <<if _check eq 2>> <<video "characters/blake/both1.2.mp4">> <</if>> <<if _check eq 3>> <<video "characters/blake/both1.3.mp4">> <</if>> <<if _check eq 4>> <<video "characters/blake/both1.4.mp4">> <</if>> @@.mc-thoughts; You rely on your friend. <<= setup.Companion.name()>> tries to help you, but the ghost's malevolent entity, fueled by her lust, proves too powerful. The force is overwhelming, and for a moment, reality itself seems to distort. You feel an odd sensation, as if you've slipped out of this world--suddenly, you feel like a cheap whore getting fucked along with your friend.<br> The ghost shoves its cock into your mouths alternately, almost as if it's mocking you. This goes on for a while before it vanishes.<br> You look at <<= setup.Companion.name()>>, but to your surprise, her face only shows satisfaction.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.mc-thoughts; You want to say something encouraging, but suddenly she speaks up herself.<br>@@ @@.notmc-speech; It was so... intense, no sextoy could ever give that kind of pleasure@@<br> @@.mc-speech; Yeah, that's for sure.@@<br> @@.notmc-speech; Alright, we've relaxed a bit, but we should keep going.@@<br><br> @@.backbtn; [[Continue|previous()]]@@<br> <<else>> <<set _check to random(1,8)>> <<if _check eq 1>> <<video "characters/blake/both2.1.mp4">> <</if>> <<if _check eq 2>> <<video "characters/blake/both2.2.mp4">> <</if>> <<if _check eq 3>> <<video "characters/blake/both2.3.mp4">> <</if>> <<if _check eq 4>> <<video "characters/blake/both2.4.mp4">> <</if>> <<if _check eq 5>> <<video "characters/blake/both2.5.mp4">> <</if>> <<if _check eq 6>> <<video "characters/blake/both2.6.mp4">> <</if>> <<if _check eq 7>> <<video "characters/blake/both2.7.mp4">> <</if>> <<if _check eq 8>> <<video "characters/blake/both2.8.mp4">> <</if>> @@.mc-thoughts; You rely on your friend. <<= setup.Companion.name()>> tries to help you, but the ghost's malevolent entity, fueled by her lust, proves too powerful. The force is overwhelming, and for a moment, reality itself seems to distort. You feel an odd sensation, as if you've slipped out of this world--suddenly, you feel like a cheap whore getting fucked along with your friend.<br> The ghost fucks you and <<= setup.Companion.name()>> alternately.This goes on for a while before it vanishes.<br> You look at <<= setup.Companion.name()>>, but to your surprise, her face only shows satisfaction.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.mc-thoughts; You want to say something encouraging, but suddenly she speaks up herself.<br>@@ @@.notmc-speech; It was so... intense, no sextoy could ever give that kind of pleasure@@<br> @@.mc-speech; Yeah, that's for sure.@@<br> @@.notmc-speech; Alright, we've relaxed a bit, but we should keep going.@@<br><br> @@.backbtn; [[Continue|previous()]]@@<br> <</if>> <</if>>
<<run setup.Companion.acknowledgeSoloHuntEnd("Blake")>> @@.mc-speech; How did your ghost hunt go?@@<br> <<if setup.Companion.companionChoseOwaissa("Blake")>> <<set _stateChance to setup.Companion.soloOdds("Blake", "Owaissa")>> <<elseif setup.Companion.companionChoseElm("Blake")>> <<set _stateChance to setup.Companion.soloOdds("Blake", "Elm")>> <</if>> <<set _check to random(1,100)>> <<if _stateChance gte _check>> @@.notmc-speech; <<= setup.Mc.name()>>, I did it! I correctly identified the ghost!@@<br> <<set _resultBlakeAlone to 1>> <<set _reward to setup.Companion.payoutSoloHunt("Blake")>> <span> Money: +$<<= _reward>> $ </span><br> <<else>> @@.notmc-speech; <<= setup.Mc.name()>>, I didn't succeed... But I gained valuable experience and I'll be better prepared next time!@@ <<set _resultBlakeAlone to 0>> <</if>> <br> <<companionExpGain "Blake" "blake">> <br> <<linkappend "@@.mc-speechLink;Tell me more about how it went.@@">> <br> <<if setup.Companion.companionLvl("Blake") lt 3>> @@.notmc-speech; I don't want to talk about it...@@ @@.warningtext; Req. Blake's lvl ≥ 3@@ <<else>> @@.notmc-speech;Well, listen...<br> At first, things went well, of course, sometimes the ghost tried to...@@<<linkappend "@@.notmc-speechLink; scare me@@">> <<set _scareVids to ["characters/blake/2.0.mp4", "characters/blake/2.2.mp4", "characters/blake/2.3.mp4", "characters/blake/2.4.mp4", "characters/blake/2.5.mp4"]>> <<randomVideoFromList _scareVids>> @@.notmc-speech;But I'm not easily frightened! <br> I continued searching for evidence.<br> The ghost became more aggressive... Sometimes it tried to @@<<linkappend "@@.notmc-speechLink;chocke me@@">> <<set _chokeVids to ["characters/blake/alone2.1.mp4", "characters/blake/alone2.2.mp4", "characters/blake/alone2.3.mp4", "characters/blake/3.0.mp4", "characters/blake/3.1.mp4", "characters/blake/3.2.mp4", "characters/blake/3.3.mp4", "characters/blake/3.4.mp4"]>> <<randomVideoFromList _chokeVids>> @@.notmc-speech;But I was stronger than it...<br> I was about to find the last piece of evidence when suddenly@@ <<linkappend "@@.notmc-speechLink;it appeared right in front of me.@@">> <<set _appearVids to ["characters/blake/alone3.1.mp4", "characters/blake/alone3.2.mp4", "characters/blake/alone3.3.mp4", "characters/blake/alone3.4.mp4", "characters/blake/alone3.5.mp4", "characters/blake/alone3.6.mp4"]>> <<randomVideoFromList _appearVids>> @@.notmc-speech;I lost control... and I might have given it what it had been after from the beginning...@@<br> <<if _resultBlakeAlone eq 1>>@@.notmc-speech; After it cu... weakened, I ran away. That's it. @@<br> @@.mc-speech; I knew you would succeed! Great job!@@ <<elseif _resultBlakeAlone eq 0>> @@.notmc-speech;It seems I just passed out.. I woke up when it was already morning. <br> That's it.@@<br> @@.mc-speech; It's okay, you'll definitely succeed next time!@@<br> @@.notmc-speech;You're right, I need to teach it a lesson for what it did to me...@@ <</if>> <</linkappend>> <</linkappend>> <</linkappend>> <</if>> <</linkappend>> <br> <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> @@.backbtn; [[Back|previous()][setup.Companion.clearSoloHuntStreet("Blake")]]@@
<<run setup.Companion.refreshSoloOdds("Blake")>> <<set _blake to setup.Companion.stateFor("blake")>> <div class="flexwrapperCompanionMainInfo"> <div class="companionImageMain"> <<image "characters/blake/blake.png">> </div> <div class="companionTextMain"> <span style="color: yellow; font-weight: bold; font-size: 1.2em;"><<= _blake.name>> :</span> <<= _blake.lvl>> lvl <<if _blake.lvl gte 5>> (max. lvl) <<else>>(<<= _blake.exp>> / <<= _blake.expForNextLvl>>) <</if>><br> <<cisCompanionSoloPicker "Blake" "her">> </div> </div> <br> @@.backbtn; [[Return|$return]] @@<br>
<<set _checkRandomCthulion to random(1,3)>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.canTentacles and _checkRandomCthulion eq 1>> <<cthulionAbility 4>> @@.mc-thoughts; <<= setup.Companion.name()>> tries to help, and the ghost pulls back. But instead, huge tentacles crawl out from the corners of the room. Before you can react, they're all over you, wrapping tight and keeping you from moving.<br> The soft, slimy tentacles start pushing into your holes, filling them with some kind of sticky liquid. You try to focus and break free, but these things know exactly what they're doing: they tease your most sensitive spots, making your body burn with desire. Your last hope is your friend, but one look at her tells you she's already lost. Her mouth's hanging open, eyes rolling back as another orgasm hits her. The room fills with wet, slurping sounds and her sweet moans.<br> There's no point fighting it anymore. You give in to the tentacles. After a while, they finally pull back, done playing with your bodies.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.notmc-speech; What... what was that?@@<br> @@.mc-speech; I have no idea, but we need to get out of here. I can't handle another round with those things.@@<br> <br> @@.backbtn; [[Continue|previous()]]@@<br> <<else>> <<if setup.Companion.sanity() gte 50 and setup.Mc.sanity() gte 50>> <<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/brook/both1.1.mp4">> <</if>> <<if _check eq 2>> <<video "characters/brook/both1.2.mp4">> <</if>> @@.mc-thoughts; You rely on your friend. Brook tries to help you, but the ghost's malevolent entity, fueled by her lust, proves too powerful. The force is overwhelming, and for a moment, reality itself seems to distort. You feel an odd sensation, as if you've slipped out of this world--suddenly, you see yourself as a cheap whore, clad in fishnet lingerie.<br> The ghost shoves its cock into your mouths alternately, almost as if it's mocking you. This goes on for a while before it vanishes.<br> You look at Brook, but to your surprise, her face only shows satisfaction.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.mc-thoughts; You want to say something encouraging, but suddenly she speaks up herself.<br>@@ @@.notmc-speech; It was amaz... awful, I mean. We can't just leave it like this. We need to continue our investigation to get rid of it!@@<br> @@.mc-thoughts; You're a bit taken aback by her reaction and were about to say that getting rid of it might not be possible, as you're still just trying to identify its type, but decide to stay silent. @@<br> @@.mc-speech; Yeah, you're right.@@<br><br> @@.backbtn; [[Continue|previous()]]@@<br> <<else>> <<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/brook/both2.1.mp4">> <</if>> <<if _check eq 2>> <<video "characters/brook/both2.2.mp4">> <</if>> @@.mc-thoughts; You rely on your friend. Brook tries to help you, but the ghost's malevolent entity, fueled by her lust, proves too powerful. The force is overwhelming, and for a moment, reality itself seems to distort. You feel an odd sensation, as if you've slipped out of this world--suddenly, you see yourself as a cheap whore, clad in fishnet lingerie.<br> The ghost fucks you and Brook alternately.This goes on for a while before it vanishes.<br> You look at Brook, but to your surprise, her face only shows satisfaction.@@<br> <<run setup.Companion.helpEventEaseActive()>> <<= setup.Companion.name()>>'s lust <<statIcon setup.StatIcon.HEALTH>> spent, sanity <<statIcon setup.StatIcon.SANITY>> eased.<br> @@.mc-thoughts; You want to say something encouraging, but suddenly she speaks up herself.<br>@@ @@.notmc-speech; It was amaz... awful, I mean. We can't just leave it like this. We need to continue our investigation to get rid of it!@@<br> @@.mc-thoughts; You're a bit taken aback by her reaction and were about to say that getting rid of it might not be possible, as you're still just trying to identify its type, but decide to stay silent. @@<br> @@.mc-speech; Yeah, you're right.@@<br><br> @@.backbtn; [[Continue|previous()]]@@<br> <</if>> <</if>>
<<run setup.Companion.acknowledgeSoloHuntEnd("Brook")>> @@.mc-speech; How did your ghost hunt go?@@<br> <<if setup.Companion.companionChoseOwaissa("Brook")>> <<set _stateChance to setup.Companion.soloOdds("Brook", "Owaissa")>> <<elseif setup.Companion.companionChoseElm("Brook")>> <<set _stateChance to setup.Companion.soloOdds("Brook", "Elm")>> <</if>> <<set _check to random(1,100)>> <<if _stateChance gte _check>> @@.notmc-speech; <<= setup.Mc.name()>>, I did it! I correctly identified the ghost!@@<br> <<set _resultBrookAlone to 1>> <<set _reward to setup.Companion.payoutSoloHunt("Brook")>> <span> Money: +$<<= _reward>> $ </span><br> <<else>> @@.notmc-speech; <<= setup.Mc.name()>>, I didn't succeed... But I gained valuable experience and I'll be better prepared next time!@@ <<set _resultBrookAlone to 0>> <</if>> <br> <<companionExpGain "Brook" "brook">> <br> <<linkappend "@@.mc-speechLink;Tell me more about how it went.@@">> <br> <<if setup.Companion.companionLvl("Brook") lt 3>> @@.notmc-speech; I don't want to talk about it...@@ @@.warningtext; Req. Brook's lvl ≥ 3@@ <<else>> @@.notmc-speech;Well, listen...<br> At first, things went well, of course, sometimes the ghost tried to...@@<<linkappend "@@.notmc-speechLink; scare me@@">> <<set _scareVids to ["characters/brook/alone1.1.mp4", "characters/brook/alone1.2.mp4"]>> <<randomVideoFromList _scareVids>> @@.notmc-speech;But I'm not easily frightened! <br> I continued searching for evidence.<br> The ghost became more aggressive... Sometimes it tried to @@<<linkappend "@@.notmc-speechLink;strangle me@@">> <<set _chokeVids to ["characters/brook/alone2.1.mp4", "characters/brook/alone2.2.mp4"]>> <<randomVideoFromList _chokeVids>> @@.notmc-speech;But I was stronger than it...<br> I was about to find the last piece of evidence when suddenly@@ <<linkappend "@@.notmc-speechLink;it appeared right in front of me.@@">> <<set _appearVids to ["characters/brook/alone3.1.mp4", "characters/brook/alone3.2.mp4"]>> <<randomVideoFromList _appearVids>> @@.notmc-speech;I lost control... and I might have given it what it had been after from the beginning...@@<br> <<if _resultBrookAlone eq 1>>@@.notmc-speech; After it cu... weakened, I ran away. That's it. @@<br> @@.mc-speech; I knew you would succeed! Great job!@@ <<elseif _resultBrookAlone eq 0>> @@.notmc-speech;It seems I just passed out.. I woke up when it was already morning. <br> That's it.@@<br> @@.mc-speech; It's okay, you'll definitely succeed next time!@@<br> @@.notmc-speech;You're right, I need to teach it a lesson for what it did to me...@@ <</if>> <</linkappend>> <</linkappend>> <</linkappend>> <</if>> <</linkappend>> <br> <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> @@.backbtn; [[Back|previous()][setup.Companion.clearSoloHuntStreet("Brook")]]@@
<<run setup.Companion.refreshSoloOdds("Brook")>> <<set _brook to setup.Companion.stateFor("brook")>> <div class="flexwrapperCompanionMainInfo"> <div class="companionImageMain"> <<image "characters/brook/brook.png">> </div> <div class="companionTextMain"> <span style="color: yellow; font-weight: bold; font-size: 1.2em;"><<= _brook.name>> :</span> <<= _brook.lvl>> lvl <<if _brook.lvl gte 5>> (max. lvl) <<else>>(<<= _brook.exp>> / <<= _brook.expForNextLvl>>) <</if>><br> <<cisCompanionSoloPicker "Brook" "her">> </div> </div> <br> @@.backbtn; [[Return|$return]] @@<br>
<<widget "companionMini">> <<set _compImg to _args[0]>> <<set _compName to _args[1]>> <<if setup.Companion.canShowCompanionMiniPanel()>> <div class="containerMini"> <<image _compImg>> <div class="scaleMini"> <<image "ui/img/sanity.png" { style: "position: relative; top: 0.375em; width:13%;" }>>_compName's Sanity: <<showmeter 'companionsanity' `setup.Companion.sanityPercent()`>> <<image "ui/img/hearth.png" { style: "position: relative; top: 0.375em; width:13%;" }>> _compName's Lust: <<showmeter 'companionlust' `setup.Companion.lust() / 100`>> </div> </div> <</if>> <<addclass "body" "style-companion-mini">> <</widget>> /* Footer-card portrait: clickable companion thumbnail in the lower-right of the HuntRun toolbar. The image rotates with the companion's in-hunt status, so the player can tell at a glance what's pending: VISIBLE -> portrait, links to CompanionMain (talk / replan) ATTACK_FAILED -> question-mark, links to CompanionFailed (the ghost grabbed her -- "go check on them") ATTACK_SAFE -> portrait, links to CompanionSucceeded (the attack window passed -- collect the result) Mirrors the classic-hunt companionCard widget that lived on widgetHauntedHouseRoom before the classic flow was retired. */ <<widget "companionCard">> <<if setup.Companion.canShowCompanionMiniPanel()>> <<set _ac to setup.Companion.active()>> <<set _sc to State.variables.showComp>> <<set _CS to setup.CompanionShow>> <<if _ac and _sc eq _CS.VISIBLE>> <a data-passage="CompanionMain" class="companion-card-link"> <<image _ac.portraitPath() "companion-image">> </a> <<elseif _ac and _sc eq _CS.ATTACK_FAILED>> <a data-passage="CompanionFailed" class="companion-card-link"> <<image "ui/img/question-mark.png" "companion-image">> </a> <<elseif _ac and _sc eq _CS.ATTACK_SAFE>> <a data-passage="CompanionSucceeded" class="companion-card-link"> <<image _ac.portraitPath() "companion-imageSucceeded">> </a> <</if>> <</if>> <</widget>> <<widget "sanityPills">> <<set _ac to setup.Companion.active()>> <<set _obj to _ac ? _ac.pronObj : "her">> <<linkreplace `"@@.usebtn; Give " + _obj + " the sanity pills.@@"`>> <<if not setup.Companion.hasSanityPills()>> @@.mc-thoughts; I don't have those pills.@@ <<elseif not setup.Companion.companionNeedsSanity()>> @@.mc-thoughts; I don't think that's needed right now.@@ <<else>> @@.mc-speech; I want you to take these sanity pills. Don't worry, they will help you.@@<br> @@.notmc-speech; Thank you, I feel a bit better.@@<br> <<run setup.Companion.giveSanityPill()>> <b>-1 sanity pills</b><br> <b><<= setup.Companion.name()>>'s sanity has increased by 30!</b><br> <</if>> <</linkreplace>> <</widget>> <<widget "cisCompanionSoloPicker">> /* Shared body for per-companion Info passages: renders the "pick her for hunt | send her solo" UI branch that's identical across Brook, Alice, Blake. Args: companion key ("Brook" / "Alice" / "Blake"), plural pronoun for the question ("to join you" vs "go alone"). */ <<set _cName to _args[0]>> <<set _cLvl to setup.Companion.companionLvl(_cName)>> <<if setup.Companion.hasFinishedSoloHunt(_cName)>> /* SugarCube does not reliably evaluate macros inside the display portion of wiki-style links in this codebase — the raw print syntax leaked to the player. Use the link macro form so both label and target are TwineScript expressions. The capture wrap mirrors the else branch and satisfies the deferred-temp-var lint, future-proofing a second widget invocation per passage. */ <<capture _cName>> @@.mc-speech;<<link `"Ask " + _cName + " how " + _args[1] + " ghost hunt went."` `_cName + "HuntEndAlone"`>> <</link>>@@<br> <</capture>> <<else>> /* <<capture>> snapshots _cName into each deferred link's payload — without it, the click-time callback reads State.temporary._cName, which holds whatever the last cisCompanionSoloPicker call wrote (currently only ever called once per passage, but a second call added later would silently route every Ask-to-Join click to the wrong companion). */ <<capture _cName>> @@.mc-speech;<<link `"Ask " + _cName + " to join you for ghost hunting tonight."`>> <<run setup.Companion.pickCisCompanion(_cName)>> <<replace "#companionInfoAnswer">>@@.mc-speech; I want you to join me for ghost hunting today@@<br> @@.notmc-speech; Yes, of course. I'll be ready. Let's meet by the entrance to the haunted house, okay?@@<br> @@.mc-speech; Yeah, let's do that.@@ <</replace>> <</link>>@@<br> <<done>> <<if _cLvl lt 2>> <<addclass ".CompanionInfoAskForHuntAlone" "disabled-link">> <</if>> <</done>> <span class="CompanionInfoAskForHuntAlone"> @@.mc-speech;<<link "I'd like you to go ghost hunting alone.">> <<run setup.Companion.deselectCisCompanion(_cName)>> <<replace "#companionInfoAnswer">>@@.notmc-speech; I think I'm already experienced enough to do it on my own. Where should I go?@@<br> @@.enterbtn;<<link `"Owaissa Street - " + setup.Companion.soloOdds(_cName, "Owaissa") + " %"`>> <<run setup.Companion.sendCompanionSolo(_cName, "Owaissa")>> <<if setup.Companion.cannotAffordSoloContract(_cName)>> <<replace "#companionInfoAnswerTwo">>@@.warningtext; I don't have enough money to buy her a contract @@ <</replace>> <<else>> <<replace "#companionInfoAnswerTwo">>@@.notmc-speech;Owaissa Street? Hmm... Yes, of course. I think I can handle it.@@ <</replace>> <</if>> <</link>>@@ @@.enterbtn;<<link `"Elm Street - " + setup.Companion.soloOdds(_cName, "Elm") + " %"`>> <<run setup.Companion.sendCompanionSolo(_cName, "Elm")>> <<if setup.Companion.cannotAffordSoloContract(_cName)>> <<replace "#companionInfoAnswerTwo">>@@.warningtext; I don't have enough money to buy her a contract @@ <</replace>> <<else>> <<replace "#companionInfoAnswerTwo">>@@.notmc-speech;Elm Street? Hmm... Yes, of course. I think I can handle it.@@ <</replace>> <</if>> <</link>>@@@@color: green; <b>-20$</b>@@<br> <span id="companionInfoAnswerTwo"> </span> <</replace>> <</link>>@@<<if _cLvl lt 2>> @@.warningtext; Req. <<= _cName>>'s lvl 2+@@ <</if>></span> <br> <span id="companionInfoAnswer"> </span> <</capture>> <</if>> <</widget>> <<widget "companionExpGain">> <<set _compName to _args[0]>> <<set _compVarName to _args[1]>> <<set _expAmount to (typeof _args[2] !== "undefined") ? _args[2] : 10>> <<set _comp to State.variables[_compVarName]>> <<if _comp.lvl gte 5>> _compName is already at the maximum level! <<else>> _compName's exp: +_expAmount <<set _comp.exp += _expAmount>> <</if>> <</widget>>
/* Unified Stage-2 dispatcher. For pizza/burger/package this is the middle scene that links onward to DeliveryEvent2; papers' Event1 is already the terminal stage (bonus + back btn) so its case ends the encounter here without going to Event2. */ <<set _ev to setup.Delivery.currentEventType()>> <<switch _ev>> <<case "burger">> <<deliveryVideo "burgerevent" 5 6>> @@.notmc-speech; Now I'll fuck you, slut@@<br> @@.mc-speech; I don't want this to <<linkappend "ever end">><br> <<deliveryVideo "burgerevent" 7 8>> @@.mc-speech; ~God~ Don't stop please, I'm cumming@@<br> @@.notmc-speech; I'm cumming too@@<br> @@.mc-speechLink; [[Cum|DeliveryEvent2]]@@<br> <</linkappend>>@@ <<case "pizza">> <<addLust 45>> <<deliveryVideo "pizzaevent" 3>> +45 <<statIcon setup.StatIcon.HEALTH>><br> @@.notmc-speech;Oh, I see you're ready now, nice and wet.@@<br> @@.mc-thoughts; What's happening to me? Why am I starting to like this?@@<br> @@.notmc-speech;Wait for me here, <<linkappend "I'll be right back">> <<deliveryVideo "pizzaevent" 4>> @@.mc-thoughts; She took the dildo and is now fucking me like a cheap whore. And the worst thing is that I like it. @@<br> @@.notmc-speech;Oh, you are so tight. Do you like the way I fuck you?@@<br> @@.mc-speech; Mm~ No...~m~No@@<br> @@.notmc-speech; Well then [[I'll continue|DeliveryEvent2]]@@ <</linkappend>>@@ <<case "package">> <<addLust 45>> <<deliveryLustOverflow>> <<deliveryVideo "packageevent" 3 4>> @@.notmc-speech; Do you like it, slut?@@<br> @@.mc-speech; Oh~Please don't stop~Your cock is so good~@@<br> <<linkreplace "@@.mc-speechLink;Continue@@">> <<addLust 45>> <<deliveryLustOverflow>> <<deliveryVideo "packageevent" 6>> @@.mc-speech; Oh~it feels amazing@@<br> @@.mc-speechLink; [[He's cumming|DeliveryEvent2]]@@ <</linkreplace>> <<case "papers">> /* Papers' Event1 is terminal: marks the cooldown, awards the bonus, and sends the player back to the map. */ <<run setup.Delivery.markPapersEvent()>> <<addLust 45>> <<deliveryVideo "papersevent" 4 5>> +45 <<statIcon setup.StatIcon.HEALTH>><br> @@.mc-speech; Oh~i'm cumming~@@<br> @@.notmc-speech; On your knees bitch,@@ <<linkappend "@@.notmc-speechLink; quickly@@">><br> <<deliveryVideo "papersevent" 6>> @@.mc-speech; Oh~so much cum@@<br> @@.notmc-speech; Wow, you are the best. I think you deserve a little bonus@@<br> @@.mc-thoughts; I feel like I'm a prostitute. I've probably already made more money with my body than with delivery.@@<br> <br> <<deliveryBonus 15>> <br> @@.backbtn;[[Leave|DeliveryMap]]@@ <br> <<deliveryLustOverflow>> <</linkappend>> <</switch>>
/* Unified Stage-3 (terminal) dispatcher. Burger/pizza/package end their encounters here. Papers terminates earlier in DeliveryEvent1 and never routes through this passage; package's low-lust fork inlines its End2 in DeliveryEventStart. */ <<set _ev to setup.Delivery.currentEventType()>> <<switch _ev>> <<case "burger">> <<run setup.Delivery.markBurgerEvent()>> <<run setup.Delivery.clearLust()>> <<deliveryVideo "burgerevent" 9>> @@.mc-speech; Ah~ Did you cum inside me?@@<br> @@.notmc-speech; I haven't fucked like this for a long time, you're a great slut, I hope to see you again sometime@@<br> @@.mc-thoughts; Fuck, I feel his cum dripping from my pussy, I hope everything will be fine@@<br> <br> <<deliveryBonus 5>> <br> @@.backbtn;[[Take a shower and leave|DeliveryMap]]@@<br> <<case "pizza">> <<run setup.Delivery.markPizzaEvent()>> <<addLust 60>> <<deliveryVideo "pizzaevent" 5>> +60 <<statIcon setup.StatIcon.HEALTH>><br> @@.mc-thoughts; I can't control myself anymore. The neighbors can probably hear my moans@@<br> @@.notmc-speech; Yes, I see how you "don't like it". Will you cum for me, slut?@@<br> @@.mc-speech; Ah~ YES~ Fuck me~ PLEASE, <<linkappend "I'M CUMMING">><br> <<deliveryLustOverflow>> <<deliveryVideo "pizzaevent" 6>> @@.notmc-speech; Now get the fuck out of here@@<br> @@.notmc-speech; Take this too. You deserved it@@<br> @@.mc-speech; Mm~ @@<br> @@.mc-thoughts; At least she gave me money. It seems even more than I usually earn. I could go now@@<br> <br> <<deliveryBonus 10 0.1>> @@.backbtn;[[Leave|DeliveryMap]]@@<br> <<run setup.Delivery.addJobSuccessEarnings()>> <</linkappend>>@@ <<case "package">> /* End1: the high-lust path (Start -> Event1 -> Event2). The low-lust End2 is rendered inline in DeliveryEventStart. */ <<addLust 15>> <<deliveryVideo "packageevent" 7>> @@.notmc-speech; Ohhh~ maybe you should pay me instead@@<br> @@.mc-speech; We had another agreement@@<br> @@.notmc-speech; Haha, of course I'm kidding. Here's your money@@<br> <<deliveryBonus 15>> <br> @@.backbtn;[[Leave|DeliveryMap]]@@<br> <</switch>>
/* Unified gate-passage dispatcher for the four delivery encounters (burger, pizza, package, papers). The per-event offer dialog lives in the switch below; the wrapper boilerplate (header image, "already delivered → thanks", payMode accounting) is in <<deliveryEventChoose>> in widgetDelivery.tw. Routing into here is from deliverySmallPassages via the order item key, mapped via setup.Delivery.eventNameForItem. */ <<set _ev to setup.Delivery.currentEventType()>> <<deliveryEventChoose _ev>> <<switch _ev>> <<case "burger">> @@.notmc-speech; Such a sweet girl, you're probably tired, do you want to come in and relax a little?@@<br> <<linkreplace "@@.mc-speechLink; You see something that looks like weed in his hand. Yes, it's definitely weed.@@">> <<image "ui/img/weed.jpg" { style: "max-width: 50%; height: auto; display: block; margin: 0 auto;" }>> <<if setup.Delivery.canAcceptBurgerWeed()>> @@.mc-speech;[[If you don't mind|DeliveryEventStart]]@@ or @@.mc-speech;[[No, sorry, I won't mess with this|DeliveryMap]]@@<br> <<else>> @@.mc-speech;[[No, sorry, I won't mess with this|DeliveryMap]]@@ <<deliveryCorrReq 5>><br> <</if>> <</linkreplace>> <<case "pizza">> @@.notmc-speech; The pizza box looks dented... Please, open it, I want to make sure everything is okay.@@<br> @@.mc-speech;<<linkreplace " Umm... yeah sure">> <<image "scenes/deliveryhub/pizzaevent/failed.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>><br> @@.notmc-speech; Ah-ha! I knew it. I'm not going to pay for it.@@<br> <<if not setup.Delivery.canAcceptPizzaDeal()>> @@.mc-thoughts; She's right, it's my fault. I guess I was unlucky@@ <<deliveryCorrReq 3>><br><br> <<deliveryTrackCorrect>> @@.backbtn;[[Back|DeliveryMap]]@@ <<else>> @@.mc-thoughts; Fuck! I really need the money. Maybe she'll take pity on me and still pay?@@<br> @@.mc-speech;[[Tell her that you need money|DeliveryEventStart]]@@ or @@.mc-speech;[[Nah, Just say sorry and leave|DeliveryMap][setup.Delivery.incrementCorrectThisShift()]]@@<br> <</if>> <</linkreplace>>@@ <<case "package">> @@.notmc-speech; You are late@@<br> <<linkreplace "@@.usebtn;Try to apologize@@">> @@.notmc-speech; I understand, no problem. Here's the money for the delivery. Listen, maybe you want to earn a little more money?@@<br> <<if not setup.Delivery.canAcceptPackageDeal()>> @@.mc-speech; That sounds strange, I'd rather decline@@ <<deliveryCorrReq 3>><br><br> @@.backbtn;[[Back|DeliveryMap]]@@ <<else>> @@.mc-thoughts; He's definitely hinting at sex, should I agree?@@<br> @@.mc-speech;[[Agree|DeliveryEventStart]]@@ or @@.mc-speech;[[Nah, i have to go|DeliveryMap]]@@<br> <</if>> <</linkreplace>> <<case "papers">> @@.notmc-speech; Yes, put them on the sofa@@<br> @@.mc-speech;<<linkreplace "Sure, no problem">> <<addLust 15>> <<image "scenes/deliveryhub/papersevent/2.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> @@.mc-thoughts; I think he's staring at my butt, what a pervert@@<br> +15 <<statIcon setup.StatIcon.HEALTH>><br> <<if not setup.Delivery.papersInitialLustHighEnough()>> @@.mc-speech; Done. I have to go, bye.@@ <<deliveryLustReq 30>><br><br> @@.backbtn;[[Back|DeliveryMap]]@@<br> <<else>> @@.mc-speech; Do you like it?@@<br> @@.notmc-speech; Yea~I mean, I don't understand what you mean...<br> Sorry, you have a nice ass, maybe I can touch it? @@<br> @@.mc-speech;[[Just a touch|DeliveryEventStart]]@@ or @@.mc-speech;[[Nah, i have to go|DeliveryMap]]@@<br> <</if>> <</linkreplace>>@@ <</switch>> <</deliveryEventChoose>>
/* Unified Stage-1 dispatcher. Switches on the active order's event key (set in $orders by initShift; resolved via currentEventType). Each case follows the per-event encounter and ends by linking to DeliveryEvent1 -- except package's low-lust fork, which inlines its End2 terminal block via linkappend so we don't need a per-event variant flag on DeliveryEvent2. */ <<set _ev to setup.Delivery.currentEventType()>> <<switch _ev>> <<case "burger">> <<run setup.Mc.setLust(100)>> @@.mc-thoughts; You've been smoking weed for a while and are just relaxing. At first you are having a friendly conversation, but after 10 minutes you find yourself on your knees with a dick in your mouth, getting endless pleasure just from @@@@.mc-speech;<<linkreplace " a blowjob">> <<deliveryVideo "burgerevent" 1 2>> @@.mc-thoughts; It seems that I will cum just from the dick in my mouth, why does it feel so good@@<br> @@.notmc-speech; Take off your clothes and show me your pussy@@<br> <<linkreplace "@@.mc-speechLink; Take off your clothes@@">> <<deliveryVideo "burgerevent" 3 4>> @@.mc-speech; ~Mm~ my pussy is all yours@@<br> @@.notmc-speech; Ha~ i know, suck a little more baby@@<br> @@.mc-thoughts; I'll do whatever you want@@<br> @@.mc-speechLink; [[Suck his cock|DeliveryEvent1]]@@<br> <</linkreplace>> <</linkreplace>>@@ <<case "pizza">> <<deliveryVideo "pizzaevent" 1>> @@.notmc-speech; So you need money but you don't want to work?@@<br> @@.mc-speech; Well, not exactly like that...@@<br> @@.notmc-speech; Of course, I'll pay you, but you'll have to do something for me.@@<br> @@.mc-speech; Hmm, okay... <<linkappend "Ouch">><br> <<deliveryVideo "pizzaevent" 2>> @@.mc-speech; Ah~ It hurts@@<br> @@.notmc-speech; Take off your clothes, now!@@<br> @@.mc-speech; She's crazy, I'd rather do [[what she wants|DeliveryEvent1]]@@<br> <</linkappend>>@@ <<case "package">> <<run setup.Delivery.markPackageEvent()>> <<addLust 15>> <<deliveryVideo "packageevent" 1>> @@.notmc-speech; You're better off doing something else instead of delivering crap@@<br> @@.mc-speech; Maybe you are right~AH~@@<br> @@.notmc-speech; For example: sit down and @@<<linkappend "@@.notmc-speechLink; suck me off@@">><br> <<addLust 30>> <<set _pick to either(2, 5)>> <<video "scenes/deliveryhub/packageevent/" + _pick + ".mp4">> @@.notmc-speech; You're good at it@@<br> @@.mc-speech; ~Hmng~ulrp~@@<br> <<if not setup.Delivery.packageLustHighEnough()>> @@.mc-thoughts; I suck dick for money, what happened to me?@@ <<deliveryLustReq 50>><br> <<linkappend "@@.mc-speechLink; He's cumming@@">><br> /* End2 terminal block -- inlined here (instead of a variant branch on DeliveryEvent2) so the low-lust fork doesn't need a flag round-trip through state. */ <<addLust 15>> <<deliveryLustOverflow>> <<deliveryVideo "packageevent" 7>> @@.notmc-speech; Yea~ that's it, you're a good girl. Here you go, you've earned it@@<br> @@.mc-thoughts; It's finally over@@<br> <<deliveryBonus 10>> <br> @@.backbtn;[[Leave|DeliveryMap]]@@<br> <</linkappend>> <<else>> @@.mc-speech; Mm~ my pussy is so wet, please [[fuck me~|DeliveryEvent1]] @@<br> <</if>> <</linkappend>> <<case "papers">> <<addLust 15>> <<deliveryVideo "papersevent" 1>> @@.notmc-speech; How about staying with me for a while? I think the work can wait, and I'll write a good review for your work?@@<br> +15 <<statIcon setup.StatIcon.HEALTH>><br> <<if setup.Delivery.papersStillCorruptible()>> +0.1 <<statIcon setup.StatIcon.CORRUPTION>> <<run setup.Mc.addCorruption(0.1)>><br> <</if>> <<if setup.Delivery.canAcceptPapersFlirt()>> <<if setup.Delivery.papersLustHighEnough()>> @@.mc-thoughts; I'm so turned on, I need to relax a little@@<br> @@.mc-speech; Maybe you are right~AH~, work can wait@@<br> @@.notmc-speech; Get on <<linkappend "your knees">><br> <<addLust 30>> <<deliveryVideo "papersevent" 2 3>><br> +30 <<statIcon setup.StatIcon.HEALTH>><br> @@.mc-speech; ~Hmng~ulrp~ It's too big to fit in my mouth@@<br> @@.notmc-speech; Oh~ I think it will fit in your pussy, I'm sure you're all wet@@<br> @@.mc-thoughts; He is right. I can not stand it any longer@@<br> @@.notmc-speech; Sit on my dick with your [[wet pussy|DeliveryEvent1]]@@<br> <</linkappend>>@@ <<else>> @@.mc-speech; Nah, I better get back to work, bye@@ <<deliveryLustReq 40>><br> @@.backbtn;[[Leave|DeliveryMap]] @@<br> <</if>> <<else>> @@.mc-speech; What? I'm not some cheap whore, I'm leaving@@ <<deliveryCorrReq 3>><br><br> @@.backbtn;[[Leave|DeliveryMap]] @@<br> <</if>> <</switch>>
<<image "ui/img/deliverybuilding.jpg" { width: "90%" }>><br> @@.location; Delivery hub@@<br> @@.mc-thoughts; This is a small office in the city specializing in the delivery of various goods. It's one of the few places where you can earn some money@@<br> <br> <<if not setup.Delivery.isOpen()>> @@.mc-thoughts;The delivery hub is not open right now (open from 8 AM to 8 PM)@@ <<else>> <<if setup.Delivery.completedShifts() gt 0>> <div class="delivery-stats"> @@.mc-action; Rank: <<= setup.Delivery.reputationLabel()>> | Streak: <<= setup.Delivery.streak()>> | Pay: $<<= setup.Delivery.jobMoneySuccessed()>>/delivery@@ <<if setup.Delivery.reputationLevel() gte 3>> @@.mc-action; | Fast routes unlocked@@ <</if>> </div><br> <</if>> @@.enterbtn;[[Go to the manager|DeliveryManager]]@@<br> <<if setup.Delivery.canStartShift()>>@@.usebtn;[[Take orders|WorkDelivery]]@@<<elseif setup.Delivery.tooTiredForShift()>>@@.mc-thoughts; I'm too tired@@ <</if>> <</if>> <br> <br> @@.backbtn;[[Leave|CityMap]]@@ <<if previous(2) is "DeliveryHub">><<addTime 3>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 3>> <</if>>
<<image "ui/img/john.jpg" { width: "70%" }>><br> <<if setup.Delivery.isFirstVisit()>> @@.mc-thoughts; You enter the manager's office and notice a man around forty. There's nothing particularly remarkable about him. As you make your presence known, he carefully assesses you, momentarily pausing his gaze on your chest. Nevertheless, you gather the courage to initiate the conversation.@@<br> <br> @@.mc-speech;Hello, my name is <<= setup.Mc.name()>>, and I'm looking for a job. Perhaps you have something suitable for me?@@<br> @@.notmc-speech; Hello, I'm John. We happen to need couriers, and I think you could be a good fit for the job.@@<br> @@.mc-speech; "Thank you! I'm ready to start working. What do I need to do for that?@@<br> @@.notmc-speech; Great! "You can work from 08:00 to 20:00 any day of the week. During this time, you'll be able to take orders and deliver items to customers.@@<br> @@.mc-speech; Understood. How will I receive orders?@@<br> @@.notmc-speech; Orders will come to you automatically. You'll receive addresses and a list of items to deliver. Your task is to deliver the items correctly to the specified addresses.@@<br> @@.mc-speech; "Got it. How much will I be paid for each order?@@<br> @@.notmc-speech; For each correctly delivered item, you'll receive $<<= setup.Delivery.jobMoneySuccessed()>>. Not bad, right? But remember, if you make a mistake, you'll only get $<<= setup.Delivery.jobMoneyFailed()>> for that delivery.@@<br> @@.mc-speech; I'll do my best not to make mistakes. Ready to start working!@@<br> @@.notmc-speech; Great, good luck with the deliveries. If you have any questions, feel free to ask.@@<br> <br> @@.mc-thoughts; It turned out to be quite simple. So, I just need to come here any day from 08:00 to 20:00 and fulfill orders. Sounds pretty straightforward.@@<br> <br> @@.mc-action; Now you can work as a courier.@@ <br> <<run setup.Delivery.markFirstVisited()>> <<elseif not setup.Delivery.isFirstVisit() and previous() isnot "DeliveryMap">> <br> <<if setup.Delivery.hasMetManagerEvent()>> @@.notmc-speech; Oh, <<= setup.Mc.name()>>, come in, don't be shy. What do you want to talk about?@@ <<else>> @@.notmc-speech; Hello, you're like umm... Susan? Milana? Doesn't matter, I'm a bit busy right now, let's talk later. If you forgot, you can work here from 08:00 to 20:00. Take orders and go ahead. Good luck.@@ <</if>> <br> <<linkreplace "@@.usebtn;Ask about payment@@">> <<if not setup.Delivery.managerBJOnCooldown()>> @@.mc-speech;I wanted to talk about payment. Is there a way to increase it somehow?<br>@@ <<if not setup.Delivery.meetsBeautyForManagerFlirt()>> @@.notmc-speech; Um... <i>He looked at me but quickly lowered his head and started flipping through his papers</i><br> I think you just need to work more<br>@@ @@.mc-thoughts; I need to catch his attention somehow<br>@@ @@.warningtext; (Req. <<statIcon setup.StatIcon.BEAUTY>> ≥ 45)@@ <<else>> <<if setup.Delivery.hasMetManagerEvent()>> @@.notmc-speech;Of course, <<= setup.Mc.name()>>, I think you know how I can help you@@<br> <<else>> @@.notmc-speech; Hm...<br> <i>He looked at me and thought about something</i>. <br> I don't think I can do it. But I could offer some part-time work for such a beautiful girl<br><i>He smiled and adjusted his belt</i><br>@@ <</if>> <<if setup.Delivery.managerWillPayExtra()>> @@.usebtn;[[Give him a blowjob|DeliveryManagerEventStart]]@@<br> <<else>>@@.mc-thoughts; Is he asking me to suck him off? No fucking way!<br>@@ @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 2)@@ @@.mc-speech;No, I'd better go<br>@@ <</if>> <</if>> <<else>>@@.notmc-speech; Enough for today, talk to me tomorrow@@ <</if>> <</linkreplace>> <<elseif previous() is "DeliveryMap">> @@.notmc-speech; Here are your hard-earned money for the shift. Not much, but it's something at least.@@ <br> <<include "EndShiftDelivery">> <</if>> <br> <br> @@.backbtn;[[Leave|DeliveryHub]] @@
<<video "scenes/deliveryhub/manager/bj.mp4">><br> @@.notmc-speech; Perhaps this job is more suitable for you? Ha-ha@@<br> @@.mc-thoughts; Shut up~ You wanted to say, but instead all you could say was:<br>@@ @@.mc-speech;~Hmng~ulrp~@@<br> @@.mc-thoughts; A big hot dick fills your entire mouth, making your pussy wet. <br>Another 10 minutes pass until he cums in your mouth@@<br> @@.notmc-speech; Ooof, you sucked the last out of me. Enough for today. You may go now@@<br> <br> <<addLust 30>> <div class="wrapperGain"> <span>You gain:</span><br> <span> Money: +10$ </span><br> <span>Experience: +10 exp</span><br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.5)>> <span><<statIcon setup.StatIcon.CORRUPTION>>: +0.5 </span> <</if>> <span class="reachedNewLvl"></span><br> </div> <br> <span id="expBar"><<showmeter 'xpBar'>></span><br> <br> <<run setup.Mc.addMoney(10)>> <<set _leveled to setup.Mc.grantExp(10)>> <<updatemeter 'xpBar' `setup.Mc.exp() / setup.Mc.neededForNextLevel()`>> <<if _leveled>> <<done>> <<replace ".reachedNewLvl">>You reached a new level - <<= setup.Mc.lvl()>> ! <</replace>> <</done>> <<updatemeter 'xpBar' `setup.Mc.exp() / setup.Mc.neededForNextLevel()`>> <</if>> @@.backbtn;[[Leave|DeliveryHub]] @@ <<run setup.Delivery.startManagerBJCooldown()>>
<<addclass "body" "style-delivery-map">> <span id="endShift" class="btnendshift btnendcolor clickable">End the shift</span> <div class="flexwrapper"> <<for _cell range setup.deliveryMapLayout>> <<capture _cell>> <<if _cell neq "">> <<set _familiar to setup.Delivery.isRouteFamiliar(_cell)>> <<set _isSpecial to (setup.Delivery.specialOrderActive() and _cell is setup.Delivery.specialOrderAddress())>> <div @class="'housecard' + (_familiar ? ' familiar-house' : '') + (_isSpecial ? ' special-house' : '')"> <<set _sp to _cell.lastIndexOf(" ")>> <<set _label to _cell.substr(0, _sp) + ", " + _cell.substr(_sp + 1)>> <<image "ui/img/delivery1.png" "iconsOnMap">> <<if _isSpecial>> @@.icontextdelivery;<<link _label "DeliverySpecialEvent">><<run setup.Delivery.setCurrentHouse(_cell)>> <</link>>@@ <div class="mapOrderIcons"><<image "ui/img/package.jpg" "mapOrderIcon rush-icon">></div> <<else>> @@.icontextdelivery;<<link _label "DeliveryAutoDeliver">><<run setup.Delivery.setCurrentHouse(_cell)>> <</link>>@@ <<set _ordersList to setup.Delivery.orders()>> <<set _hasOrder to false>> <<for _oi to 0; _oi lt 3; _oi++>> <<if _ordersList[_oi].address is _cell and setup.Delivery.activeIcon(_oi)>> <<set _hasOrder to true>> <</if>> <</for>> <<if _hasOrder>> <div class="mapOrderIcons"> <<for _oi to 0; _oi lt 3; _oi++>> <<if _ordersList[_oi].address is _cell and setup.Delivery.activeIcon(_oi)>> <<image _ordersList[_oi].image "mapOrderIcon">> <</if>> <</for>> </div> <</if>> <</if>> </div> <<else>> <div class="housecard"></div> <</if>> <</capture>> <</for>> </div> <<script>> if (typeof window.endShiftHandler === 'undefined') { window.endShiftHandler = function () { Engine.play('DeliveryManager'); }; $(document).on('click', '#endShift', window.endShiftHandler); } <</script>>
<<set _house to setup.Delivery.currentHouse()>> <<set _img to setup.deliveryHouses[_house]>> <<set _sp to _house.lastIndexOf(" ")>> <<set _address to _house.substr(0, _sp) + ", " + _house.substr(_sp + 1)>> <<image "ui/img/" + _img { width: "90%" }>><br> @@.location; _address@@<br><br> <<if setup.Delivery.specialOrderType() is "safe">> <<image "ui/img/deliverygirlhappy.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> @@.notmc-speech; You're a lifesaver! I've been waiting for this all day. Here, keep the change.@@<br> <<run setup.Delivery.bankSafeSpecialOrder()>> <<deliveryTrackCorrect>> @@.mc-action; You earned $<<= setup.Delivery.specialOrderPay()>> for the rush delivery!@@<br> <<deliveryTipCheck>> <br> @@.backbtn;[[Back|DeliveryMap]]@@ <<else>> <<image "scenes/deliveryhub/specialevent/1.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> @@.notmc-speech; Finally! Get in here, I need to check the package before I pay.@@<br> @@.mc-thoughts; Why can't he just check it at the door?@@<br> <<if setup.Mc.corruption() gte 3>> @@.mc-speech;[[Go inside|DeliverySpecialUnsafe]]@@ or @@.mc-speech;[[No thanks, just pay me|DeliverySpecialRefused]]@@<br> <<else>> @@.mc-speech; Uh... fine, but make it quick.@@<br> @@.mc-thoughts; I just want the tip. Maybe he really does just need to check it.@@<br> @@.mc-speechLink;[[Step inside|DeliverySpecialCoerced]]@@<br> <</if>> <</if>> <<addTime `setup.Delivery.deliveryTime()`>>
<<image "scenes/deliveryhub/specialevent/2.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> @@.mc-thoughts; He locks the door behind me. Shit.@@<br> @@.notmc-speech; You want to get paid? Earn it.@@<br> @@.mc-thoughts; Oh fuck. No. I'm not doing that — not for a few bucks.@@<br> @@.mc-speech; Forget it. Keep the package — I'm leaving.@@<br> <br> [[Push past him|DeliverySpecialRefused]]
@@.notmc-speech; No inspection, no payment. That's how it works, sweetheart.@@<br> <<run setup.Delivery.clearSpecialOrder()>> @@.mc-speech; What?! But I delivered your order!@@<br> @@.mc-thoughts; What an asshole. I wasted my time for nothing.@@<br> <br> @@.backbtn;[[Back|DeliveryMap]]@@
<<run setup.Delivery.addLust(45)>> <<image "scenes/deliveryhub/specialevent/2.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> @@.mc-thoughts; He locks the door behind me. Shit.@@<br> @@.notmc-speech; You want to get paid? Earn it.@@<br> @@.mc-speech;<<linkreplace " I... I need the money">> <<video "scenes/deliveryhub/specialevent/1.webm">> @@.notmc-speech; Good girl. On your knees.@@<br> @@.mc-speech; ~Mm~@@<br> <<linkreplace "@@.mc-speechLink; Get on your knees@@">> <<set _pick to random(2, 4)>> <<video "scenes/deliveryhub/specialevent/" + _pick + ".webm">> @@.notmc-speech; Turn around@@<br> @@.mc-speech; ~Ah~ just be quick@@<br> @@.mc-speechLink;[[Let him continue|DeliverySpecialUnsafe2]]@@<br> <</linkreplace>> <</linkreplace>>@@
<<set _pick2 to random(5, 6)>> <<video "scenes/deliveryhub/specialevent/" + _pick2 + ".webm">> @@.mc-speech; ~Ah~ God...@@<br> @@.notmc-speech; Fuck, you're tight. I'm going to cum@@<br> <<linkreplace "@@.mc-speechLink; Please not inside...@@">> <<set _pick3 to random(7, 8)>> <<video "scenes/deliveryhub/specialevent/" + _pick3 + ".webm">> <<run setup.Delivery.clearLust()>> @@.notmc-speech; Too late for that. Here's your money, now get out.@@<br> @@.mc-thoughts; Fuck... I can feel it dripping out of me@@<br> <br> <<run setup.Delivery.clearSpecialOrder()>> <<deliveryBonus setup.Delivery.specialOrderPay()>> <br> @@.backbtn;[[Leave|DeliveryMap]]@@ <</linkreplace>>
<<image "characters/alice/meet-alice.jpg" { width: "100%" }>> @@.notmc-speech; Just in time, thank you!<br> Wait... I think I've seen you before, near the witch's house.@@<br> @@.mc-speech; Yeah, I work for her, doing ghost identification contracts. But sometimes, I have to take on side jobs too.@@<br> @@.notmc-speech; Wow, that's awesome! You're lucky--you get to do something really interesting. Meanwhile, I'm stuck at home doing reports and paperwork. It's so boring... Sometimes I just wish I could do something more exciting.@@<br> @@.mc-speech; Well, you could come with me. Though, you know it can get dangerous...@@<br> @@.notmc-speech; I'd love to, but I have so much tedious work. It's exhausting...@@<br> @@.mc-speech; I could help you out if it's not too complicated.@@ @@.notmc-speech; Really? If you help me with this boring stuff, then we can go together. It's not hard at all--just a couple of documents, nothing major. Here, I'll give you my contact info.@@<br> @@.mc-speech; That sounds perfect. By the way, I'm <<= setup.Mc.name()>>. What's your name?@@<br> @@.notmc-speech; I'm Alice. Nice to meet you, <<= setup.Mc.name()>>.@@<br> @@.mc-speech; Nice to meet you too, Alice. I'll get in touch with you soon.@@<br> @@.mc-thoughts; Having an extra hand in ghost hunting could be really helpful.@@<br> <br> @@.mc-action; You've met <b>Alice</b>. To go ghost hunting with her, you'll need to help her with her work first.@@<br> <br> <<run setup.Delivery.addJobSuccessEarnings()>> <<run setup.Delivery.markMetAlice()>> @@.backbtn; [[Leave|DeliveryMap]]@@<br>
<<nobr>> <<run setup.Delivery.initShift()>> <<run setup.Delivery.updatePayTier()>> @@.mc-action;Here are your orders for this shift: the address and associated items. Good luck!@@ <br> <br> <br> <<set _orders to setup.Delivery.shuffledOrders()>> <<for _i to 2; _i gte 0; _i-->> <div class="order-container"> <span class="address-item"><<= _orders[_i].address>> --</span> <<image _orders[_i].image "iconPx">> </div><br> <</for>> <<if setup.Delivery.specialOrderActive()>> <div class="order-container special-order"> <span class="address-item"><<= setup.Delivery.specialOrderAddress()>> -- RUSH</span> <<image "ui/img/package.jpg" "iconPx">> <span class="rush-pay">$<<= setup.Delivery.specialOrderPay()>></span> </div><br> <</if>> <</nobr>> @@.movebtn;[[Start|DeliveryMap]] @@
<<set _house to setup.Delivery.currentHouse()>> <<set _img to setup.deliveryHouses[_house]>> <<set _sp to _house.lastIndexOf(" ")>> <<set _address to _house.substr(0, _sp) + ", " + _house.substr(_sp + 1)>> <<image "ui/img/" + _img { width: "90%" }>><br> @@.location; _address@@<br> <br> @@.mc-thoughts;What should I deliver here?@@<br> <br> <div class=deliverywrapper> <<for _slot to 1; _slot lte 3; _slot++>> <<capture _slot>> <<set _order to State.variables["order" + _slot]>> <<set _slotClass to (_slot eq 1 ? "itemAvailableOne" : (_slot eq 2 ? "itemAvailableTwo" : "itemAvailableThree"))>> <div @class="_slotClass"> <<image _order.image "iconPx">><br> @@.usebtn;<<link "Deliver the order">><<run setup.Delivery.setCurrentOrder(_slot)>><<goto "DeliveryEvent">> <</link>>@@<br> </div> <</capture>> <</for>> </div> <br> @@.backbtn;[[Leave|DeliveryMap]] @@
<<set _orderNum to setup.Delivery.currentOrder()>> <<set _order to State.variables["order" + _orderNum]>> <<set _match to false>> <<for _o range setup.Delivery.orders()>> <<if _o.address === setup.Delivery.currentHouse() and _o.item is _order.item>><<set _match to true>><<break>><</if>> <</for>> <<if _match>> <<switch _order.item>> <<case "pizza" "package" "burgers" "newspapers">><<include "DeliveryEventChoose">> <<case "books">><<if not setup.Delivery.hasMetAlice()>><<include "MeetAlice">> <<else>><<deliveryGenericSuccess>><</if>> <<default>><<deliveryGenericSuccess>> <</switch>> <<else>> <<image "ui/img/deliverygirlsad.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> <<run setup.Delivery.addJobFailEarnings()>> <<deliverySorry>><br> @@.mc-speech; Damn, I must have made a mistake.@@<br> <br> <br> @@.backbtn;[[Back|DeliveryMap]] @@ <</if>> <<run setup.Delivery.setActiveIcon(_orderNum - 1, false)>> <br> <br> <<addTime `setup.Delivery.deliveryTime()`>>
<<if passage() is "DeliveryHouse">> <<set _slotClasses to [".itemAvailableOne", ".itemAvailableTwo", ".itemAvailableThree"]>> <<for _i to 0; _i lt 3; _i++>> <<set _cls to _slotClasses[_i]>> <<if setup.Delivery.activeIcon(_i)>> <<addclass _cls "visible">> <<removeclass _cls "hidden">> <<else>> <<addclass _cls "hidden">> <<removeclass _cls "visible">> <</if>> <</for>> <</if>>
<<run setup.Delivery.resetActiveIcons()>> <<run setup.Delivery.endShift()>> <<run setup.Delivery.updatePayTier()>> <<if setup.Delivery.correctThisShift() gte 3>> <<set _perfectBonus to random(5, 10)>> <<run setup.Delivery.grantPerfectShiftBonus(_perfectBonus)>> @@.mc-action; Perfect shift! Bonus: $<<= _perfectBonus>>@@<br> <</if>> Earned during the shift: <<= setup.Delivery.earnedMoney()>> $ <<run setup.Delivery.bankEarnedMoney()>>
<<set _house to setup.Delivery.currentHouse()>> <<set _orderNum to setup.Delivery.orderSlotForHouse(_house) + 1>> <<if _orderNum gt 0>> <<run setup.Delivery.setCurrentOrder(_orderNum)>> <<goto "DeliveryEvent">> <<else>> <<set _img to setup.deliveryHouses[_house]>> <<set _sp to _house.lastIndexOf(" ")>> <<set _address to _house.substr(0, _sp) + ", " + _house.substr(_sp + 1)>> <<image "ui/img/" + _img { width: "90%" }>><br> @@.location; _address@@<br><br> @@.mc-thoughts; No one here ordered anything from me.@@<br> <br> @@.backbtn;[[Back|DeliveryMap]]@@ <</if>>
/* Format a passage-name street ("Amethyst Street 42") as a display address ("Amethyst Street, 42"). Last space becomes ", ". */ <<widget "deliveryAddressFmt">> <<set _src to _args[0]>> <<set _i to _src.lastIndexOf(" ")>> <<set _out to _src.substr(0, _i) + ", " + _src.substr(_i + 1)>>_out <</widget>> /* Random video from /deliveryhub/<subdir>/N.mp4 where N is a random integer in [start, end]. Replaces the 4-10 line <<if>> ladders each encounter passage used to repeat for every video pick. _args[0]: subdirectory under /deliveryhub/ (e.g. "burgerevent") _args[1]: start index _args[2]: end index (optional -- defaults to start, single video) */ <<widget "deliveryVideo">> <<set _start to _args[1]>> <<set _end to (_args.length gt 2 ? _args[2] : _args[1])>> <<set _n to random(_start, _end)>> <<video "scenes/deliveryhub/" + _args[0] + "/" + _n + ".mp4">> <</widget>> /* Shared "thank-you" randomised one-liner for successful deliveries. */ <<widget "deliveryThanks">> <<switch either(0, 1, 2)>> <<case 0>>@@.notmc-speech; Great, thank you so much!@@ <<case 1>>@@.notmc-speech; Awesome! Thank you very much.@@ <<default>>@@.notmc-speech; Just in time, thank you!@@ <</switch>> <</widget>> /* Shared "wrong delivery" randomised one-liner. */ <<widget "deliverySorry">> <<switch either(0, 1, 2)>> <<case 0>>@@.notmc-speech; Sorry, but I think you made a mistake.@@ <<case 1>>@@.notmc-speech; Apologies, but I believe there might be a mistake.@@ <<default>>@@.notmc-speech; Sorry, but I think there might be an error.@@ <</switch>> <</widget>> /* "You earned an extra $N" block shared by the climax passages. Awards money and (capped at 10) corruption. Default corruption gain is 0.2. _args[0]: money bonus _args[1]: corruption gain (optional, default 0.2) */ <<widget "deliveryBonus">> <<set _amt to _args[0]>> <<set _corr to (_args.length gt 1 ? _args[1] : 0.2)>> You earned an extra $<<= _amt>><br> <<run setup.Mc.addMoney(_amt)>> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(_corr)>> +<<= _corr>> <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <</widget>> /* Clamp mc.lust back to 0 when it has overflowed 100, and repaint the lust meter. Used by several climax passages. */ <<widget "deliveryLustOverflow">> <<if setup.Mc.lust() gte 100>> <<run setup.Mc.setLust(0)>> <<run setup.Mc.clampLust()>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <</if>> <</widget>> /* deliveryEventChoose -- container widget for the shared gate of each first-contact delivery encounter (pizza, package, burger, papers). Handles the init-if-ndef, header image, earnedMoney accounting, and the generic "already delivered → thank you → back" branch. The per-encounter dialog lives in _contents and is only rendered when the encounter hasn't been completed yet. _args[0]: type key from setup.deliveryEvents */ <<widget "deliveryEventChoose" container>> <<set _cfg to setup.deliveryEvents[_args[0]]>> <<set _varName to _cfg.varName>> <<if ndef State.variables[_varName]>><<set State.variables[_varName] to 0>><</if>> <<if _cfg.payMode eq setup.DeliveryPayMode.ON_ENTRY>><<run setup.Delivery.addJobSuccessEarnings()>><<deliveryTrackCorrect>><</if>> <<image "scenes/deliveryhub/" + _cfg.headerImg { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> <<if State.variables[_varName] eq 1>> @@.notmc-speech; Great, thank you so much!@@<br> <<if _cfg.payMode eq setup.DeliveryPayMode.ON_DONE>><<run setup.Delivery.addJobSuccessEarnings()>><<deliveryTrackCorrect>><</if>> <<deliveryTipCheck>> <br> @@.backbtn;[[Back|DeliveryMap]]@@ <<else>> <<= _contents>> <</if>> <</widget>> /* Emit a "corruption required" gate line -- shared by the Choose gates. */ <<widget "deliveryCorrReq">> @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ <<= _args[0]>>)@@ <</widget>> <<widget "deliveryLustReq">> @@.warningtext; (Req. <<statIcon setup.StatIcon.HEALTH>> ≥ <<= _args[0]>>)@@ <</widget>> /* Random tip on correct deliveries (30% chance, $2-$5). */ <<widget "deliveryTipCheck">> <<set _tipRoll to random(1, 100)>> <<if _tipRoll lte 30>> <<set _tipAmount to random(2, 5)>> <<run setup.Delivery.addTip(_tipAmount)>> @@.mc-action; The customer tipped you $<<= _tipAmount>>!@@<br> <</if>> <</widget>> /* Track a correct delivery for perfect-shift bonus. */ <<widget "deliveryTrackCorrect">> <<run setup.Delivery.incrementCorrectThisShift()>> <<run setup.Delivery.trackVisit(setup.Delivery.currentHouse())>> <</widget>> /* Generic successful-delivery block: used when the matched item has no custom encounter. */ <<widget "deliveryGenericSuccess">> <<image "ui/img/deliverygirlhappy.jpg" { style: "max-width: 100%; height: auto; display: block; margin: 0 auto;" }>> <<run setup.Delivery.addJobSuccessEarnings()>> <<deliveryTrackCorrect>> <<deliveryThanks>> <<deliveryTipCheck>> <br><br> @@.backbtn; [[Back|DeliveryMap]] @@ <</widget>>
<<run setup.Events.rollGhostSanityEventDecreased()>> <<includeStyle>> <<includeStyle2>> <div id="videoContainer"> <div id="eventVideo"> <<if setup.Events.videoEventIsMp4()>> <<video setup.Events.videoEvent() { id: "myVideo", style: "width: 100%; max-height: 500px;" }>> <<else>> <<image setup.Events.videoEvent() { class: "displayCentredImgs", style: "max-height: 500px;" }>> <</if>> </div> <<run setup.activateTool("uvl")>> <<if setup.Events.bansheeActive()>> @@.mc-thoughts; Suddenly, out of the corner of your eye, you spot a faint figure. It slowly becomes clearer -- standing in front of you is a girl with pale skin and piercing eyes. Your body freezes, and you can't move.<br> She glides toward you, her movements almost hypnotic. When her lips touch yours, a fire ignites inside you. You can't resist -- your lips respond to hers. The kiss is unbelievably sweet, soft yet full of passion, sending shivers down your spine. A wave of intense pleasure washes over you, making you forget everything else. Every part of you responds, as if you're being pulled into a state of euphoria.@@<br><br> @@.usebtn; [[Embrace it|$return][setup.Mc.addSanity(-setup.Events.ghostSanityEventDecreased()); setup.Mc.applyLustDelta(4)]]@@ <span>-<<statIcon setup.StatIcon.SANITY>> +<<statIcon setup.StatIcon.HEALTH>></span> <<run setup.Events.clearBanshee()>> <<elseif setup.Events.cthulionActive()>> @@.mc-thoughts; Tentacles creep out from the corner and begin wrapping around your body, trying to invade all your intimate areas.@@<br> @@.mc-speech; N-Nooo~ What is this disgusting thing?! Get away from me!@@<br> @@.usebtn; [[Embrace it|$return][setup.Mc.addSanity(-setup.Events.ghostSanityEventDecreased()); setup.Mc.applyLustDelta(4)]]@@ <span>-<<statIcon setup.StatIcon.SANITY>> +<<statIcon setup.StatIcon.HEALTH>></span> <<run setup.Events.clearCthulion()>> <<else>> <<eventRandomizerText setup.Events.currentArgForRandomizer()>><br> <<addLustByPart 1>> <<if setup.Events.hasEnergyToRunAway()>> @@.usebtn;[[Run away|$return][setup.Mc.addEnergy(-1)]]@@ <span>-<<statIcon setup.StatIcon.ENERGY>></span> <<else>> @@.mc-thoughts; I'm too tired to run@@ <span>-<<statIcon setup.StatIcon.ENERGY true>></span> <</if>> or @@.usebtn; [[Embrace it|$return][setup.Mc.addSanity(-setup.Events.ghostSanityEventDecreased()); setup.Mc.addLustByPart(setup.Events.currentArgForRandomizer(), 4)]]@@ <span>-<<statIcon setup.StatIcon.SANITY>> +<<statIcon setup.StatIcon.HEALTH>></span> <<companionHelpOption>> <</if>><br> </div> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> /% includeStyleEventMC handles both the static-house FurnitureSearch chain and the procedural-hunt current-room-dark case. %/ <<includeStyleEventMC>>
<<script>> window.messyRoom = { trashItems: ["#trash1", "#trash2", "#trash3", "#trash4", "#trash5"], nextPassage: "hotelEvent", placeTrashRandomly: function() { this.trashItems.forEach(id => { let x = Math.random() * 90 + "%"; let y = Math.random() * 90 + "%"; $(id).css({ top: y, left: x }); }); }, removeTrash: function(id) { $(id).remove(); this.trashItems = this.trashItems.filter(item => item !== id); if (this.trashItems.length === 0) { // All trash items are removed Engine.play(this.nextPassage); } } }; $(document).one(':passageend', function() { if (window.messyRoom.trashItems.length > 0) { window.messyRoom.placeTrashRandomly(); } }); <</script>> <<nobr>> <<run setup.Events.setCleanedUp(false)>> <div class="room-container"> <<image "ui/img/trash1.png" { class: "trash", id: "trash1", onclick: "window.messyRoom.removeTrash('#trash1')" }>> <<image "ui/img/trash2.png" { class: "trash", id: "trash2", onclick: "window.messyRoom.removeTrash('#trash2')" }>> <<image "ui/img/trash3.png" { class: "trash", id: "trash3", onclick: "window.messyRoom.removeTrash('#trash3')" }>> <<image "ui/img/trash4.png" { class: "trash", id: "trash4", onclick: "window.messyRoom.removeTrash('#trash4')" }>> <<image "ui/img/trash5.png" { class: "trash", id: "trash5", onclick: "window.messyRoom.removeTrash('#trash5')" }>> </div> <div id="cleanup-message" style="display: none;">Done!</div> <</nobr>>
<div id="minigame_mainvideo"> <<seduceGhostMinigameVideo>> <b> <<run setup.Events.clampGhostOrgasmFloor()>> Ghost's Arousal: <<= setup.Events.ghostOrgasmMeter()>> | <<run setup.Events.clampMcOrgasmFloor()>>Your Arousal: <<= setup.Events.mcOrgasmMeter()>> <br> </b> </div> <div id="minigame_text"> <<if setup.Events.minigameEventFailed() eq 1>> @@.warningtext; FAILED @@<br> <<elseif setup.Events.minigameEventFailed() eq 0>> @@color:green; SUCCEED@@<br> <<else>> <</if>> <<seduceGhostMinigameText>> </div> <div id="minigame_menu"> <<if setup.Events.ghostOrgasmMeter() gte 100>> <br> @@.usebtn; [[Continue investigating|$return][setup.Events.recordWeakenReward()]]@@ <<elseif setup.Events.mcOrgasmMeter() gte 100>> <br> @@.usebtn; [[You're passing out|HuntEnd]]@@ <<else>> <<seduceGhostMinigameMenu>> <</if>> </div>
/* Energy-gated link. _args[0]=passage, _args[1]=label. Body is the action to run on click (e.g. <<run setup.X.Y()>>). When MC energy < 1, renders a grey "Not enough energy" line instead. */ <<widget "energyGate" container>> <<if setup.Mc.energy() lt 1>> @@.mc-thoughts; Not enough energy@@ <<else>> <<set _body to _contents>> <<capture _body>> <<link _args[1] _args[0]>> <<= _body>> <</link>> <</capture>> <</if>> <</widget>> <<widget "seduceGhostMinigameVideo">> <<set _videoList to setup.SeduceGhostMinigame.videoList()>> <<set _selected to _videoList[random(0, _videoList.length - 1)]>> <<if _selected.type == "video">> <<video _selected.src "displayCentredImgs">> <<else>> <<image _selected.src { class: "displayCentredImgs", alt: "Image" }>><br> <</if>> <</widget>> <<widget "seduceGhostMinigameMenu">> <<if setup.Events.minigameVideo() eq "start">> Beauty: <<= setup.Mc.beauty()>><br> <<run setup.Events.clearMinigameEventFailed()>> <<energyGate "SeduceGhostMinigame" "@@.usebtn; Try to attract a ghost@@ ">> <<run setup.SeduceGhostMinigame.tryAttract()>> <</energyGate>> <<link "@@color:red; Leave@@" `$return`>><<run setup.SeduceGhostMinigame.leave()>><</link>> <<elseif setup.Events.minigameVideo() eq "seduceFailed">> <b>Beauty: <<= setup.Mc.beauty()>></b><br> <<energyGate "SeduceGhostMinigame" "@@.usebtn; Try again@@ ">> <<run setup.SeduceGhostMinigame.tryAgain()>> <</energyGate>> <<link "@@color:red; Leave@@ " `$return`>><<run setup.SeduceGhostMinigame.leave()>><</link>> <<elseif setup.Events.minigameVideo() eq "seduce">> <<link "Continue" "SeduceGhostMinigame">> <<run setup.SeduceGhostMinigame.continueSeduce()>> <</link>><b><<image "ui/img/hearth.png" { style: "position: relative; top: 0.375em; width:25px;" }>></b> | <<link "@@color:red; Try to leave@@" "SeduceGhostMinigame">> <<run setup.SeduceGhostMinigame.tryLeave()>> <<if ndef setup.Events.minigameVideo()>><<goto `$return`>><</if>> <</link>> <<elseif setup.SeduceGhostMinigame.hasSubdue()>> <<if setup.SeduceGhostMinigame.resistCostsEnergy() and setup.Mc.energy() lt 1>> @@.mc-thoughts; Not enough energy@@ <<else>> <<link "Resist" "SeduceGhostMinigame">> <<run setup.SeduceGhostMinigame.resist()>> <</link>> <</if>> <<link "Submit" "SeduceGhostMinigame">> <<run setup.SeduceGhostMinigame.submit()>> <</link>> <b><<image "ui/img/hearth.png" { style: "position: relative; top: 0.375em; width:25px;" }>></b> | <<energyGate "SeduceGhostMinigame" "Subdue">> <<run setup.SeduceGhostMinigame.subdue()>> <</energyGate>> <<else>> <<energyGate "SeduceGhostMinigame" "Resist">> <<run setup.SeduceGhostMinigame.resist()>> <</energyGate>> <<link "Submit" "SeduceGhostMinigame">> <<run setup.SeduceGhostMinigame.submit()>> <</link>> <b><<image "ui/img/hearth.png" { style: "position: relative; top: 0.375em; width:25px;" }>></b> <</if>> <</widget>> <<widget "seduceGhostMinigameText">> <<if setup.Events.minigameVideo() eq "seduceFailed">> <<if setup.Events.chanceToAttractFailedFlag() eq 1 or ndef setup.Events.chanceToAttractFailedFlag()>> @@.mc-thoughts;You try to attract the ghost, stripping down and showing off your juicy pussy and tight tits, taking increasingly lewd poses.@@<br> @@.mc-speech;Damn, wasted my time, this fucker isn't showing up!@@<br> <<else>> @@.mc-thoughts;You strip off your clothes, exposing your wet lips and hard nipples, and there he is - the ghost, with a huge, already hard cock, ready for action.@@<br> @@.mc-speech; Oh~ I need to keep myself in check... but damn, it's so big...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "seduce">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;You seduce him, showing off all your charms, and you see the ghost can't hold back any longer. He erupts, cumming on you, covering your body with warm semen just from the sight of your sensuous display.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You seduce the ghost, moving from one enticing pose to another, feeling your body burn with desire. Your own sensuality brings you to climax, gasping from the intensity of the moment.@@<br> <<else>> @@.mc-thoughts;You strip down, taking lewd poses, showing off your pussy and tits, feeling your wetness grow, getting turned on by your own performance.@@<br> @@.mc-speech;Fuck, I'm so hot watching myself... I bet he's getting hard just from looking at me...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "slapface">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;The ghost can't take it anymore when he's slapping your face with his cock, each slap arousing him more until he climaxes, covering your face with his cum.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;The ghost slaps your face with his cock, and the strange, unexpected pleasure from this act makes you reach orgasm, your body trembling with unusual pleasure.@@<br> <<else>> @@.mc-thoughts;The ghost approaches, his cock slapping your face as if it's his entertainment. You feel your cheeks redden, your body trembling with a mix of humiliation and arousal.@@<br> @@.mc-speech;He's slapping me with his dick... it's so degrading... but why do I like it so much?@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "subdueslapface">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;You control the situation, and as you slap yourself with his cock, the ghost can't hold back, cumming on you, covering your face and chest with his semen.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You take control, slapping yourself with his cock, and this feeling of power and sexuality brings you to orgasm, your body shuddering with pleasure.@@<br> <<else>> @@.mc-thoughts;You grab his cock, start slapping it against your own face, feeling the power and control.@@<br> @@.mc-speech;Mmm... who's the whore here, huh? I decide when and how...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "assjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;His cock slides between your ass cheeks, and this sensation brings the ghost to climax, he cums, covering your buttocks and back with his semen.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;His cock slides between your ass cheeks, each movement sending waves of pleasure through you, and you reach orgasm without penetration, it's so arousing.@@<br> <<else>> @@.mc-thoughts;His cock rubs against your pussy, making you feel him getting harder, causing you to moan with desire.@@<br> @@.mc-speech;His cock rubbing against my pussy... it's so hot, how it feels... I want it inside me so bad...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "subdueassjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;Controlling the situation, you make him cum, his semen splattering over your buttocks and back as he loses control.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You move your hips, controlling his pleasure, and this feeling of power makes you cum, your body trembling with ecstasy.@@<br> <<else>> @@.mc-thoughts;You move your hips, controlling how his cock slides between your ass cheeks, feeling him lose control.@@<br> @@.mc-speech;You'll move as I want you to, ghost...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "titjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;The sensation of your breasts around his cock is too much for him, he climaxes, covering your tits with his cum, unable to control himself any longer.@@ <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;His cock moves between your breasts, the friction and the sight of his pleasure push you towards an orgasm, your body responding to the eroticism of the act.@@ <<else>> @@.mc-thoughts;The ghost fucks your tits with his cock, you feel it pulsing, leaving traces of precum on your skin.@@<br> @@.mc-speech;He's fucking my tits... I feel like he's about to cum... it's so arousing...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "subduetitjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;You control how he uses your breasts, and he climaxes, covering your tits with his cum, unable to hold back.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You squeeze your tits around his cock, feeling every movement, and this sense of power over his pleasure makes you reach orgasm, arousing you with the control.@@<br> <<else>> @@.mc-thoughts;You squeeze your tits around his cock, controlling every thrust, making him moan with pleasure.@@<br> @@.mc-speech;Show me how badly you want to cum on my tits...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "rimjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;Your tongue drives him wild, and he can't hold back, climaxing and covering you with his cum from the intensity of the sensation.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You lick his ass, feeling the power and submission in your actions, which unexpectedly drives you to orgasm, your body quivering with pleasure.@@<br> <<else>> @@.mc-thoughts;You bend over, feeling his control, your tongue exploring his ass, each movement making him moan. You're under his command, fulfilling his dirtiest fantasies.@@<br> @@.mc-speech;I'm licking his ass... he completely controls me... it's so dirty, but so sexy...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "subduerimjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;Your actions drive him to the edge, and he climaxes, covering you with semen as you control his pleasure.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You explore his anus with your tongue with a sense of control, and this unexpected feeling of power causes you to orgasm.@@<br> <<else>> @@.mc-thoughts;You take control, using your tongue as you wish, making him tremble with pleasure.@@<br> @@.mc-speech;You're under my control, ghost... I do it the way I want...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "blowjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;Your skill makes him lose control, and he climaxes, spilling his cum all over your face and chest from the intensity of the sensations.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You feel his cock in your mouth, and the sensation of power and pleasure from his reactions brings you to orgasm, your body shuddering with delight.@@<br> <<else>> @@.mc-thoughts;You take his cock in your mouth, feeling its warmth and hardness, your lips moving, creating a vacuum that makes him moan with pleasure.@@<br> @@.mc-speech;His dick in my mouth... he's using me like his personal whore... it's so fucking good...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "subdueblowjob">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;You dictate the pace, and he can't hold back, cumming on you, covering your face and chest with cum from your control.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;You control every movement, making him moan, and this feeling of power causes you to orgasm, your body trembling with pleasure.@@<br> <<else>> @@.mc-thoughts;You control the rhythm, dictating his pleasure, your lips and tongue deciding when and how he feels it.@@<br> @@.mc-speech;You'll only get what I allow...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "penetratepussy">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;He just enters you, and this is enough to make him lose control, he cums, covering your pussy with semen.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;His cock enters your pussy, and this sensation of being filled and the control over the situation makes you reach orgasm.@@<br> <<else>> @@.mc-thoughts;The ghost enters you, his cock penetrating your wet pussy just once, filling you with a sense of completion. You realize there's still a chance to stop this.@@<br> @@.mc-speech;Fuck, he's inside me... but I can still stop this...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "penetrateanal">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;He just enters you, and it's enough to make him lose control, he cums, covering your buttocks with semen.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;His cock penetrates your ass, and this feeling of fullness and control over the situation makes you reach orgasm.@@<br> <<else>> @@.mc-thoughts;You feel his cock entering your ass just once, creating a mix of pain and pleasure. There's still a chance to stop it.@@<br> @@.mc-speech;God, he's in my ass... but I can still control this...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "fuckpussy">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;His cock thrusts in and out of you, and this makes him cum, covering your pussy and stomach with semen.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;His hard thrusts into your pussy drive you to orgasm, you feel every thrust, sinking into ecstasy.@@ <<else>> @@.mc-thoughts;The ghost fucks your dripping pussy with such force, it feels like he wants to tear you apart. His cock goes in and out, filling you, making you moan with each deep thrust. You feel your juicy hole embracing his hard tool.@@<br> @@.mc-speech;Damn, he's fucking me like the last slut... I know I should stop him, but it feels so damn good... how can I resist when I'm this fucking wet...@@<br> <</if>> <<elseif setup.Events.minigameVideo() eq "fuckanal">> <<if setup.Events.ghostOrgasmMeter() gte 100>> @@.mc-thoughts;His rough penetration into your ass brings him to orgasm, he cums, covering your buttocks and back with semen.@@<br> <<elseif setup.Events.mcOrgasmMeter() gte 100>> @@.mc-thoughts;He fucks your ass with such force that you climax, each thrust bringing a new wave of pleasure.@@<br> <<else>> @@.mc-thoughts;His engorged cock thrusts into your tight ass, stretching you with each brutal push. He uses your ass like his toy, each movement causing sharp sensations, mixing pain with unbelievable pleasure.@@<br> @@.mc-speech;He's fucking my ass so hard... I should try to stop this, but his dick is so deep, I can barely think... it's so fucking hot...@@<br> <</if>> <</if>> <</widget>>
<<widget "eventRandomizerText">> <<set _bodyPart to _args[0]>> <<set _ct to setup.Events.corruptionTier()>> <<print setup.Events.eventTextFor(_bodyPart, _ct)>> <<if setup.Events.shouldOrgasm(_bodyPart)>> <<addSanity -25>> <<addLust -100>> <<run setup.Events.setOrgasmCooldown(3)>> <br> <<if _bodyPart eq "pussy">> <<randRangeVideo "mechanics/orgasm/pussy" 1 5 ".mp4">> @@.mc-thoughts; A violent wave of pleasure crashes through your entire body. Your legs buckle and your vision blurs as an uncontrollable orgasm tears through you. Every nerve is on fire, your pussy clenching and spasming around him as you scream out, unable to stop yourself.@@<br> @@.mc-speech; AHH~ I-I'm cumming!! Oh god, I'm cumming so hard~!!@@<br> @@.mc-thoughts; The intensity overwhelms your mind. For a moment, everything goes white. When the sensation finally fades, you feel something slipping away inside you — a piece of yourself you can't quite hold onto.@@<br> <<elseif _bodyPart eq "anal">> <<randRangeVideo "mechanics/orgasm/anal" 1 6 ".mp4">> @@.mc-thoughts; Your whole body seizes up as a deep, shameful orgasm rips through you from behind. Your back arches violently and your mouth falls open in a silent scream. You never imagined you could cum from this — but your body betrays you completely, trembling and convulsing around him.@@<br> @@.mc-speech; N-no... I'm... I'm cumming from my ass~?! This can't be happening~!!@@<br> @@.mc-thoughts; The humiliation mixes with the overwhelming pleasure, drowning out your thoughts. Your mind feels foggy, fragile — like something inside you just cracked.@@<br> <</if>> <</if>> <</widget>> <<widget "companionHelpOption">> <<if setup.Events.hasCompanionOnPlan1()>> <<set _cName to setup.Companion.name()>> <<if setup.Events.companionIsAroused()>> <<if _cName eq "Brook">> or @@.usebtn;<<link `_cName + " helps you"`>><<run setup.Events.companionDrainForHelp()>><<replace "#videoContainer">><<include "BrookHelp">> <</replace>> <</link>>@@ <<elseif _cName eq "Alice">> or @@.usebtn;<<link `_cName + " helps you"`>><<run setup.Events.companionDrainForHelp()>><<replace "#videoContainer">><<include "AliceHelp">> <</replace>> <</link>>@@ <<elseif _cName eq "Blake">> or @@.usebtn;<<link `_cName + " helps you"`>><<run setup.Events.companionDrainForHelp()>><<replace "#videoContainer">><<include "BlakeHelp">> <</replace>> <</link>>@@ <<elseif setup.Events.companionIsInlineFriend()>> or @@.usebtn; [["Call "+_cName + " for help"|$return][setup.Events.companionDrainForHelp()]]@@ <</if>> <<else>> or @@.usebtn; [["Call "+_cName + " for help"|$return][setup.Events.companionDrainForHelp()]]@@ <</if>> - _cName's <<statIcon setup.StatIcon.SANITY>> and + _cName's <<statIcon setup.StatIcon.HEALTH>> <</if>> <</widget>>
<<nobr>> <div class="flexwrapper"> <div class="housecard"> <<image "ui/img/energy-drink.png" "icon">><br> <<if setup.Mc.energyDrinkAmount() gte 1>> @@.usebtn;<<link `"Drink (+3 energy) - " + setup.Mc.energyDrinkAmount() + " left"` "Bag">><<run setup.Mc.useEnergyDrink()>> <</link>>@@ <<else>>You don't have energy drink <</if>> </div> <div class="housecard"> <<image "ui/img/cosmetics.png" "iconPx">><br> <<if setup.Mc.makeupAmount() gte 1>>You have <<= setup.Mc.makeupAmount()>> makeup charges left. <<else>>You don't have cosmetics <</if>> </div> <div class="housecard"> <<image "ui/img/sanity-pills.png" "iconPx">><br> <<if setup.Mc.sanityPillsAmount() gte 1>>You have <<= setup.Mc.sanityPillsAmount()>> sanity pills<br> <<if setup.Ghosts.isHunting()>> @@.usebtn;<<link "Use sanity pills" "Bag">> <<run setup.Mc.useSanityPill()>> <<run setup.Mc.applySanityDelta(30)>> <</link>>@@ <</if>> <<else>>You don't have sanity pills <</if>> </div> <div class="housecard"> <<image "ui/img/crucifix.webp" "iconPx">><br> <<if setup.ToolController.crucifixAmount() gte 1>>You have <<= setup.ToolController.crucifixAmount()>> crucifix. <<else>>You don't have a crucifix <</if>> </div> <div class="housecard"> <<image "ui/img/medicine.png" "iconPx">><br> <<if setup.Mc.medicineAmount() gte 1>>You have <<= setup.Mc.medicineAmount()>> health pill<<if setup.Mc.medicineAmount() gte 1>><<print "s">> <</if>><br> <<if setup.Mc.isPenalized()>> @@.usebtn;<<link "Use health pills" "Bag">> <<run setup.Mc.useMedicine()>> <<run setup.Mc.clearPenalty()>> <</link>>@@ <</if>> <<else>>You have <<= setup.Mc.medicineAmount()>> health pill<<if setup.Mc.medicineAmount() gte 1>><<print "s">> <</if>> <</if>> </div> <div class="housecard"> <<image "ui/img/holywater.png" "iconPx">><br> <<if setup.MissingWomen.hasHolyWater()>>You have holy water <<else>>You don't have holy water <</if>> </div> <div class="housecard"> <<if setup.MissingWomen.hasRescueClue()>> <<image "characters/rescue/rescue-clue.png" "iconPx">><br> <<link "@@.usebtn;Look at the photo@@">><<replace ".flexwrapper">><<set _photoClass = setup.MissingWomen.tornStyleRandom()>><<image 'characters/rescue/house/' + setup.MissingWomen.randomRescuePhotoNumber() + '.jpg' { class: _photoClass, width: "100%" }>> <</replace>> <</link>> <</if>> </div> <div class="housecard"> <<if setup.MonkeyPaw.tarotCarryStage() eq setup.TarotStage.CARRYING and setup.HuntController.isInsideHuntPassage()>> <<image "mechanics/cursedpossessions/tarot-cards/tarot.png" "iconsOnMap">><br> <<link "@@.usebtn; Look at the deck@@" "TarotCards">><</link>> <</if>> </div> <div class="housecard"> <<if setup.MonkeyPaw.isCarrying()>> <<image "mechanics/cursedpossessions/monkey-paw/monkeypaw.jpg" "icon">><br> <<link "@@.usebtn; Look at the paw@@" "MonkeyPaw">><</link>> <</if>> </div> <div class="housecard"> <<if setup.Mall.hasPepperSpray()>> <<image "ui/img/spray.png" "iconPx">><br> Pepper spray (<<= setup.Mall.pepperSprayCharges()>> charges left) <</if>> </div> <div class="housecard"> </div> <div class="housecard"> <<if setup.MonkeyPaw.guideStage() eq setup.MonkeyPawGuide.PURCHASED>> <<image "mechanics/cursedpossessions/monkey-paw/monkeypaw-page.jpg" "icon">><br> <<link "@@.usebtn;Inspect@@">><<replace ".flexwrapper">><<image "mechanics/cursedpossessions/monkey-paw/monkeypaw-page.jpg" "displayCentredImgs">> <</replace>> <</link>> <</if>> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> </div> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <</nobr>> <<backOrReturn>>
<div id="statusContainerPiercing"> <<for _p range setup.piercingList>> <div @id="'statusPiercing' + _p.target"> <<if State.variables[_p.var] eq setup.ClothingState.WORN>> <<hovertip _p.tip>><<image "ui/icons/" + _p.icon>> <</hovertip>> <<if _p.lustVar>><<run State.variables[_p.lustVar] = 1>><</if>> <</if>> </div> <</for>> </div>
v.0.5.3 - New "rogue-like" houses with new rooms and mechanics. Will be greatly expanded in future. - Keyboard navigation shortcuts added (hold ALT/CMD to get key hints) - Removed the Enigma haunted house (coming back in 2 or 3 updates) - Ectoplasm is collected during hunts, and the witch and no longer requires an active contract - Ghost movement now scales with MC prettiness - Baiting reworked: it ramps lust with orgasm risk and a duration limit, plus new bait videos - Random hunt events are now weighted by what the MC is wearing - Hornier spirit box responses - Body-part sensitivity now shown in the UI and drives lust gain; sensitivities grow during play and soft-cap around 20 - Alarm clock in the bedroom, EMF/UVL timers under the clock - Autosave when the MC sleeps; energy regained on the midnight skip - Settings menu, with a "mute all videos" toggle (videos now default to unmuted) - Option to buy back clothing lost during a hunt - Click the side panel icons to undress during hunts; clothes removed mid-hunt are restored on exit - Cheats moved to the Settings menu and persist between saves; added a tarot-card cheat - Library tips added <<linkappend "v.0.5.2">> - Major ghost hunt rework: new HUD shows live status, lights-off has tactical use, and ghosts now respond to lust, clothing, overcharged tools, and bait - Hunt difficulty tuned so a naiive strategy with no purchased equipment will win about 85% of the time (reduced from 99.9%). - New endings: sanity collapse, and a haunt failure when caught with no clothes - Monkey Paw rework: cleaner wishes and clearer consequences - New event: park mugging - Fixed a softlock during The Twins event - Fixed Elm and Owaissa Street videos not turning grayscale when lights were off - Fixed a bug in the Freeze hunt and removed its forced auto-advance - Fixed a missing message in the special-delivery low-corruption path\ <</linkappend>> <<linkappend "v.0.5.1">> - Added cursed home item events: after losing a haunted house run, there is a 40% chance a ghost curses one of your household objects (TV, computer, bed, shower, or bathtub), triggering a unique encounter when used - All companions can now be undressed during ghost hunts as their levels increase - Disabled back/forward history buttons by default (can be re-enabled via Cheats menu) - Adjust the delivery minigame so that it sucks less, added special delivery events\ <</linkappend>> <<linkappend "v.0.4.8">> - Added a task for summoning the succubus - Added events for summoning the succubus - Added events for summoning other ghosts (spirit, the twins, tentacles, mare) - Added events for summoning the succubus during a ghost attack while hunting ghosts (5 events) - Added an event with tentacles in the witch's house\ <</linkappend>> <<linkappend "v.0.4.7">> - Added content with trans characters: *You can now find a partner for ghost hunting online: (3 partners available) *(Partners are not tied to any specific porn model) - Added 4 events with cursed items in the MC's house * If cursed items are not sold for several days, an event will occur during sleep, watching TV, masturbating to porn on the PC, or during a nap. *Events progress gradually, starting with sleep in the bedroom\ <</linkappend>> <<linkappend "v.0.4.6">> - Succubus added to the game (currently 2 events in the house (PC and TV)) The Succubus appears in the game when you reach 6 corruption or more\ (in the living room (from 18 to 20 hours) the possibility to open the door will appear)\ - Contracts added for ghost identification with 1 piece of evidence and no evidence (increased reward) - Some bugs fixed\ <</linkappend>> <<linkappend "v.0.4.5">> - New task from the witch: weaken the ghost (from level 5) - Added an ability for The Twins ghost - New Ghost: Raiju - Added a new location - the park - Added an event for the park and a possession event in the park.\ <</linkappend>> <<linkappend "v.0.4.4">>\ - New haunted location: Prison "Ironclad" - Now information about ghosts can only be purchased from the witch. - Some videos have been added when finding clothes in a haunted house. - Fixed some bugs\ <</linkappend>> <<linkreplace "v.0.4.3">> - The ghost hunting system has been changed: Now the frequency and type of ghost interactions depend on the MC's lust. - At the beginning of the game, you can choose more sensitive body parts. - The more sensitive the body part, the more lust the character gains from interacting with the ghost. - The MC's lust increases with high corruption (corruption increases with each ghost interaction and even outside of ghost hunts) - Now the ghost can affect the MC's mind. - A new location for possession has been added - a church. - A new girl has been added for the "Missing Girls" quest - Ash. - A new ability for the ghost Moroi has been added: (When using the spirit box, if the character's mind is easily influenced, there's a chance MC could become possessed) This also works if you are hunting with Brooke (if her level is 2 or higher)). - Several icons have been added to track the character's clothing. - A new location has been added - Beauty Salon (currently only with piercings). - Now the frequency of tool ticks will depend on the character's level (can be adjusted). - A new scene for Julia has been added.\ <</linkreplace>> <<linkreplace "v.0.4.2">> - Added Paranormal Detector in the witch's shop (allows you to see the correct furniture, in which cursed possessions, stolen clothes, and other items are hidden) - You no longer need to click on tools to find evidence (Instead, a timer is activated.) - The "Missing Girls" task has been updated -- now you can spy on them (While spying on the girls, you can become possessed (if they catch you)) - Now you can take on a more challenging contract (the ghost will hide one piece of evidence) - x2 the reward. (Some ghosts are currently impossible to identify, as not all of them have unique abilities). - The temperature range for a room without a ghost has been adjusted, now it's between 13 and 16 degrees. - A choker has been added to the clothing store. \ <</linkreplace>> <<linkreplace "v.0.4.1">> - The ghost hunt has been slightly changed. - Tarot cards have been added to haunted houses. - Monkey paw have been added to haunted houses. - Added cursed hunt. (You can replace it with a regular hunt (at the bottom of the guide)) - Now there is a chance to become possessed (Possessed card - very small chance, for now only this way) - The completion time for follower tasks has been reduced - Changed the possession system for missing girls (After 24:00, the chance of possession increases by about 5% for each hour) - Prices for some tools from the witch have been reduced\ <</linkreplace>> <<linkreplace "v.0.4.0">> Added: - New ghost: Banshee! (Ability)<<linkreplace "Spoiler">>During the ghost hunting, she may use her ability (it doesn't depend on anything, just a small chance of appearance)(There's currently no way to learn about her ability anywhere.) <</linkreplace>> - The ability for Cthulion to appear during ghost hunting has been added. - Now the bra can be stolen. - Now the follower can walk home with you. <<linkreplace "Spoiler">>The Spirit ghost may follow you <</linkreplace>> - Now, clicking the button opens the tool bar\ <</linkreplace>> <<linkreplace "v.0.3.9">> Added: - Now fitness level affects energy. (Every 10 fitness points grants 1 energy) - New Quest: Missing Girls. <<linkreplace "Spoiler">>\ There are currently 4 missing girls. The quest begins at the witch's house and continues at the church. After speaking with the nun, a board displaying information about the missing girls appears. The board updates daily, and you can accept a quest from it after 6:00 PM. You must complete the quest by 6:00 PM the following day. If the quest is not completed by 12:00 PM the next day, the girl will become possessed and can no longer be saved. <</linkreplace>> - You can give sanity pills to your follower. - Furniture has been added to haunted houses, where stolen clothes or cursed items can now be hidden. - When moving between rooms or searching furniture, there's a chance for an event to occur (similar to when using tools).\ <</linkreplace>> <<linkreplace "v.0.3.8">> Added: - New character: Blake! - Now, when encountering a ghost on Elm Street, different videos are shown - You can buy a phone (quick access to contacts) - New department in the mall - New scenes in the webcam show - Fixed some bugs\ <</linkreplace>> <<linkreplace "v.0.3.7">> Added: -EMF reader only works when the ghost interacts with the environment (e.g., turning off the lights) - Some videos have been added, which are displayed during the interaction between the ghost and mc - The style of any video changes slightly if the light is off in any room during a ghost hunt - New ghost: Cthulion (Unique ability (event))<<linkreplace "Spoiler">>\ An event will occur if you lose (0 sanity) or if Cthulion catches you during the hunt. <</linkreplace>> - Unique ability of the Spirit has been added. (event)<<linkreplace "Spoiler">>\ It follows the MC home (3 possible events during: watching TV/sleeping/taking a nap). <</linkreplace>> - Unique ability of the Myling has been added. (event)<<linkreplace "Spoiler">>\ After the ghost hunt, when returning home with clothes on, an event will occur <</linkreplace>> - Instead of temperature rising, ghosts can now steal clothes (for now: outerwear or panties.) - Changed: - Prices for clothing have been reduced - Some bugs fixed\ <</linkreplace>> <<linkreplace "v.0.3.6">> Added: - New character: Alice! - You can go ghost hunting on Owaissa Street or Elm Street together with Alice - You can go ghost hunting on Elm Street together with Brook. - New event with Brook during ghost hunt. - Send Brook ghost hunting alone (starting from level 2). - Send Alice ghost hunting alone (starting from level 2). - Hotkeys for the different ghost hunting tools - The ability to click on tool icons instead of the "+" link. - Level 2 and 3 thermometers now display a colored result (see the guide). - EMF now displays a colored result. - Ability to earn money by performing webcam shows. Changed: - The temperature range for the "High Temperature" evidence has been adjusted to 19-24. - The reward for correctly identifying a ghost has been increased. - The reward for the delivery mini-game has been increased. - Delivery mini-game events are now available once a day. - Fixed the bug causing an infinite loop during the ghost hunt event. - Fixed some small bugs \ <</linkreplace>> <<linkreplace "v.0.3.5">>\ Added: - The ability to sneak into the witch's house (while she's sleeping) (you need to steal the key when the witch is distracted). - A friend for ghost hunting together (you can find her in the library): - You can give her tasks or tell her to follow you during ghost hunts. - You can level her up, which affects the chance of encountering ghosts and her sanity. - For now, you can only explore the first house (Owaissa Street) with her. - The description of the Mimic ghost can now be obtained when meeting the new friend. - Minor interface changes.\ <</linkreplace>> <<linkreplace "v0.3.4">> Added: - Unique ability of the Mimic has been added. - Unique ability of the Goryo has been added. - Unique ability of the Shade has been added. - Unique ability of the Phantom has been added. - Now a ghost can change its "favorite room". (The ghost will try to change its favorite room in the intervals: 0-19, 20-39, 40-59 minutes of each hour (35% chance to change room). - Witch's quest to find cursed objects (requires level 2 or higher). - New location: Library. - Some events in the library\ <</linkreplace>> <<linkreplace "v0.3.3">> Changes: - Decreased sanity for each use of tools in the dark: -0.35 per use. - Some videos in the real realm during ghost hunt have been changed. - The game's interface has been slightly modified (black background for text). - If you choose the "stay" option during the event (ghost hunt), sanity decreases randomly (by 1 to 5) Added: - New ghost: Mare. New department in the store (electronics): you can buy a webcamera <<linkreplace "spoiler">> (available only after the event with the Mare ghost and after researching information about this ghost on the internet). <</linkreplace>> - New items in the clothing store. - New item (holy water) <<linkreplace "spoiler">>(currently only needed for the event with the Mare ghost, obtained for free at the church). <</linkreplace>> - Item descriptions have been added (increasing beauty). - Special abilities for some ghosts: Mare (event), Wraith (event), Demon, Deogen, Oni, Jinn. - Use the internet to search for information about ghosts (random). - Information about ghosts is automatically added to the Ghostpedia (ghost icon) when the character encounters the ghost's special ability or finds information about that ability online. - Events in the gym\ <</linkreplace>> <<backOrReturn>>\ <<done>>\ <<addclass ".linkselector" "disabled-link">>\ <</done>>
<div class="flexwrapper"> <div class="housecard"> <<image "ui/img/gym-icon.png" "icon">> @@.icontextcity; [[Gym|Gym]]@@ </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/home.png" "icon">> @@.icontextcity; [[Home|Home]]@@ </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/mall.png" "icon">> @@.icontextcity; [[Mall|Mall]]@@ </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/witchhouse.png" "icon">> @@.icontextcity; [[Witch's House|Witch]]@@ </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/library-icon.png" "icon">> @@.icontextcity; [[Library|Library]]@@ </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/park.png" "icon">> @@.icontextcity; [[Park|Park]]@@ </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/church-ico.png" "icon">> @@.icontextcity; [[Church|Church]]@@ </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/deliveryhub.png" "icon">> @@.icontextcity; [[Delivery Hub|DeliveryHub]]@@ </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/beauty-salon.png" "icon">> @@.icontextcity; [[Beauty Salon|BeautySalon]]@@ </div> <div class="housecard"> </div> <div class="housecard"> </div> <<if setup.MissingWomen.hasActiveQuest()>><<image "characters/rescue/down.png" { class: "downPointer clickable", onclick: "SugarCube.Engine.play('RescueMap');" }>> <</if>> </div> <<nobr>> <<if setup.Gui.isCityNightOverlayActive()>> <<addclass "body" "style-city-night-overlay">> <</if>> <</nobr>>
<div id="guide"> <h1>Pocket guide to ghost hunting</h1> <p> Have you forgotten the extensive 3 hours of mandatory ghost hunting training? No fret! WoMan co. Has the pocket guide for you with all the essentials how to locate and identify any apparition. Read on! </p> <section> <h2>Staying safe!</h2> <p> During ghost hunting hours you are encouraged to pay attention to these your mental state. For your convenience we've broken down your attributes into an easy to remember list! </p> <dl> <dt>Sanity</dt> <dd> <p> As you interact with the supernatural your grip on reality will loosen. <b>If you lose too much of your sanity you black out and faint.</b> A rescue team will be dispatched for you in the morning*. </p> <div style="font-size: 6px"> * - WoMan co. is not responsible for the safety of ghost hunters and will not reimburse any medical expenses that the subject might incur. </div> </dd> <dt>Lust</dt> <dd> During a hunt the freelancer might sense feelings of growing arousal and sexual attraction towards moving shadows and translucent apparitions. The hunter is advised to keep such feelings under control as <b>ghosts get more active the more lustful you are</b>. WoMan co. will not pay for obstetric care or abortions of any kind. </dd> <dt>Energy</dt> <dd>Ghost hunting can be a physically demanding activity. <b>Make sure you show up rested.</b></dd> <dt>Corruption</dt> <dd> <p> While not medically relevant, we have been advised by our legal team that we must inform you that prolonged and repeated contact with the supernatural, areas affected by it or individuals that live in such areas will cause your sense of sexual decency to degrade. </p> <p>This warning is legally binding.</p> </dd> </dl> </section> <section> <h2>Must know topics!</h2> <p> We have assembled here a list of essential information that ghost hunters tend to forget. <i>Please do not call our sales team with questions about ghost hunting!</i> </p> <ul> <li> You can't just burst into other peoples houses to search for ghosts. <b>You need to get a contract from a licensed witch before you can start ghost hunting.</b> </li> <li> <b>You must wait until 11:00 PM before starting a hunt.</b> We do not provide a lobby for hunters waiting the witching hours. <b>Wait in your own house.</b> </li> <li> <p><b>Identify the ghost waiting room as soon as possible! Many tools only work there.</b></p> <p>Identification of the ghost favorite room cannot be provided by WoMan co. as <b>most ghost change locations over the night</b></p> </li> <li>Every ghost can produce three pieces of evidence. Some will produce more.</li> <li><b>Mark every evidence you find in your journal!</b></li> <li>Once you have found all the evidence you should be able to identify the ghost type. Mistakes are common.</li> </ul> </section> <section> <h2>Your tools</h2> <p> Upon receiving your ghost hunting certification a WoMan co. partner you should have been provided with the basic tools you need to assist you on your journey. Use them according with the following instructions to acquire the pieces of evidence necessary for ghost identification. </p> <table> <tr> <th></th> <th> Tool </th> <th> Info </th> <th>Time</th> <th>Room</th> <th>% Success</th> </tr> <tr style="font-style: italic; border-bottom: 1px solid #aaa;"> <td> </td> <th> </th> <td> Tool description </td> <td>When to use this tool</td> <td>Where to use this tool</td> <td>Chance of success</td> </tr> <tr> <td> <<image "ui/img/emf.png" "iconPx">> </td> <th> EMF 5 </th> <td> Electromagnetic field reader. A reading of 5 counts as EMF evidence. </td> <td>10 minutes from since the last interaction</td> <td>Any room</td> <td>100%</td> </tr> <tr> <td> <<image "ui/img/glass.png" "iconPx">> </td> <th> Ectoplasm glass </th> <td> When used, might provide ectoplasmic stains that can be used as evidence. </td> <td>Any time</td> <td>Favorite room</td> <td>15% chance of success for Ectoplasmic Glass level 1</td> </tr> <tr> <td> <<image "ui/img/gwb.png" "iconPx">> </td> <th> Ghost writing Book (GWB) </th> <td> When the GWB is used, a ghost might leave a writing that can be used as evidence. </td> <td>Any time</td> <td>Favorite room</td> <td>15% chance of success for the GWB level 1</td> </tr> <tr> <td> <<image "ui/img/spiritbox.png" "iconPx">> </td> <th> Spiritbox </th> <td> If a ghost leaves a recorded message upon usage, that can be used as evidence. </td> <td>Any time. <b>If the lights are off</b>.</td> <td>Favorite room</td> <td>15% chance of success for the Spiritbox level 1</td> </tr> <tr> <td> <<image "ui/img/thermometr.png" "iconPx">> </td> <th> High temperature </th> <td> <p>All ghosts make rooms warmer, but it is known that some of them cause a very high temperature increase.</p> <p>This is the primary tool to identify a ghost favorite room.</p> </td> <td>Any time</td> <td>Evidence only found in the favorite room. Useful everywhere.</td> <td>100%</td> </tr> <tr> <td> <<image "ui/img/uvl.png" "iconPx">> </td> <th> Ultraviolet light </th> <td> Some ghosts leave fingerprints on interaction that can be made visible with the ultraviolet light and count as evidence. </td> <td>10 minutes since the last interaction.</td> <td>Any</td> <td>100%</td> </tr> </table> <details> <summary>Temperature range explanation</summary> <dl> <dt>26º-21º</dt> <dd>Ghost favorite room and, possibly, high temperature evidence.</dd> <dt>23º-18º</dt> <dd>Ghost favorite rooms fall within this range.</dd> <dt>18º-13º</dt> <dd>Normal room.</dd> </dl> <p> Note that the temperature ranges overlap. To better evaluate the results either use your best judgement or upgrade your thermometer. </p> </details> </section> <section> <h2>Ending the Hunt</h2> <p> After finding all three pieces of evidence, you can conclude the hunt and leave the house. </p> <p> Any belongings left in the house after the hunt will be auctioned on the first opportunity. </p> <p style="color:grey; font-size: 10px; text-align: center"> TM & © 2026 WoMan Co. All rights reserved </p> </section> </div> <<if (previous() eq "Guide") and setup.Gui.guideReturnPassage()>> @@.backbtn;<<link "Back">> <<goto `setup.Gui.guideReturnPassage()`>> <</link>>@@<br> <<else>> <<backOrReturn>> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<if previous() neq "Evidence">><<run setup.Gui.setGuideReturnPassage(previous())>><</if>> <b>Welcome to the game!</b> This game is similar to titles like Phasmophobia and Demonologist. If you are familiar with them, you will find it easy to get the hang of things. Here's a brief guide: @@.enterbtn;[[Player guide -> Evidence]]@@ <<nobr>> <<linkreplace "Sensitive body part">> <b>What's your extra sensitive spot?</b><br> <em>The chosen one will occur more frequently during the ghost hunt than the other body parts, bringing more lust.</em><br> <<bodyPartRadio "brain" "Mind">> <<bodyPartRadio "tits" "Boobs">> <<bodyPartRadio "ass" "Ass">> <<bodyPartRadio "mouth" "Tongue">> <<bodyPartRadio "pussy" "Pussy">> <<bodyPartRadio "anal" "Anus">> <</linkreplace>> <</nobr>> @@.backbtn;<<link "Back">> <<goto `setup.Gui.guideReturnPassage()`>> <</link>>@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<div id="statusContainer"> <<mcStatusBody>> </div>
<<if setup.Ghosts.knowledgeUsed()>> <<done>> <<= '<<addclass ".' + setup.Ghosts.chosenEvidence() + '" "blackColor">>'>> <</done>> <</if>> <div class="backgroundForTextNotebook"> @@.location ;Evidence@@<br> <br> <div class="flexwrapperNotebook"> <div> <b> * <span class="emf"><<evidenceCheckbox "EMF5Check">>EMF 5 </span><<linkreplace "Tips:">><br> <span style="color: red; font-weight: bold; -webkit-text-stroke: 1px black;">Red</span> means evidence<br> <span style="color: yellow; font-weight: bold; -webkit-text-stroke: 1px black;">Yellow</span> means it's not evidence.<br> <span style="color: green; font-weight: bold; -webkit-text-stroke: 1px black;">Green</span> means nothing happened *try again*. <</linkreplace>> <br>* <span class="glass"><<evidenceCheckbox "EctoglassCheck">> Ectoplasm</span><br> * <span class="gwb"><<evidenceCheckbox "GWBCheck">> Ghost writing book</span><br> * <span class="spiritbox"><<evidenceCheckbox "SpiritboxCheck">> Spiritbox</span><br> * <span class="temperature"><<evidenceCheckbox "TemperatureCheck">> High temperature </span><<linkreplace "Tips:">><br> Normal temperature: 13 - 18.<br> Ghost's favorite room: 18 - 23.<br> Evidence "High temperature": 21 - 26.<br> If you have a level 2 or 3 thermometer - color is added. (See the guide). <</linkreplace>> <br>* <span class="uvl"><<evidenceCheckbox "UVLCheck">> UVL Fingerprints</span><br> </b> </div> <a data-passage="Ghostopedia"><<image "ui/img/ghostopedia.png" " iconPC">><br></a> </div> <br> <div class="journal-container"> <<for _g range setup.Ghosts.list()>> <span @class="_g.evidenceClasses()" @data-ghost="_g.name"><<hovertip _g.hoverHtml()>><<= _g.name>> <</hovertip>></span> <</for>><br> <<backOrReturn>> </div> </div> <<addclass "body" "style-notebook">> <<bodyBackground "assets/ui/img/journal-inside.webp">> <<done>> <<addclass ".linkselector" "disabled-link">> <<script>> var refreshHighlights = function () { var matches = setup.Ghosts.matchingNames(setup.Ghosts.readEvidenceChecks()); setup.Ghosts.list().forEach(function (g) { var el = document.querySelector('[data-ghost="' + g.name + '"]'); if (el) el.classList.toggle("right", matches.has(g.name)); }); }; refreshHighlights(); $('.flexwrapperNotebook input[type="checkbox"]').on('change', function () { /* autocheck's change handler runs first and syncs $state; defer one tick so we read the fresh value. */ setTimeout(refreshHighlights, 0); }); <</script>> <</done>>
<div class="flexwrapper addGap5"> <<for _contact range setup.Gui.phoneContacts()>> <<set _stats to State.variables[_contact.stateKey]>> <div class="housecard"> <<if !_contact.isUnlocked()>> @@.mc-thoughts; _contact.lockedHint @@<br> <<image "ui/img/question-mark.png" "contactsImages">> <<else>> @@.notmc-speech; _stats.name @@<br> _stats.lvl lvl <<if _stats.lvl gte 5>> (max. lvl) <<else>> (_stats.exp / _stats.expForNextLvl) <</if>><br> <<image _contact.portrait "contactsImages">><br> <<if setup.Time.hours() lte 7>> <<if _contact.isHuntingAlone()>> @@.mc-thoughts; She is currently on a ghost hunt.@@ <<else>> @@.mc-thoughts; She's sleeping/busy@@<br> <</if>> <<elseif _contact.isPossessed()>> <<linkreplace "@@.enterbtn;Text her@@">> _contact.possessedHint <</linkreplace>> <<elseif _contact.isWithRain()>> @@.mc-thoughts; _contact.withRainHint @@ <<else>> @@.enterbtn;<<link "Text her" _contact.infoPassage>> <</link>>@@<br> <</if>> <</if>> </div> <</for>> </div> <br> <div> @@.enterbtn;[[Ghostopedia]]@@ </div> <br/> <<backOrReturn>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<widget "companionExp">> <<set _cName to setup.Companion.name()>> <<if _cName eq "Brook" or _cName eq "Alice" or _cName eq "Blake">> <<if setup.Companion.isAtMaxLvl(_cName)>> <<= _cName>> is already at the maximum level! <<else>> <<= _cName>>'s exp: + <<= _args[0]>> <<run setup.Companion.grantExpTo(_cName, _args[0])>> <</if>> <</if>> <</widget>> <<widget "companionLinks">> <<set _ac to setup.Companion.active()>> <<if _ac>> <a data-passage="CompanionMain"> <<image _ac.portraitPath() "companion-image">> </a> <</if>> <</widget>> <<widget "companionLinksSuccess">> <<set _ac to setup.Companion.active()>> <<if _ac>> <a data-passage="CompanionSucceeded"> <<image _ac.portraitPath() "companion-imageSucceeded">> </a> <</if>> <</widget>> <<widget "companionTextEvent">> /* Sanity-tier (1..4) dispatcher for the CompanionEvent passage. Per-companion dialog lives on the catalogue (eventCopy) and the shared transEventCopy table; this widget just renders it. Trans companions also stamp the transFirstStage flag on every render so the next event picks the post-stage portrait + tier-1 variant. Tiers 2-4 add a +15 lust hit on the MC. */ <<set _tier to _args[0]>> <<set _ac to setup.Companion.active()>> <<if _ac>> <<set _markup to _ac.eventTextForTier(_tier)>> <<if _markup>> <<= _markup>> <<if _ac.isTrans>> <<run setup.Companion.markTransFirstStage()>> <</if>> <</if>> <</if>> <<run setup.Companion.applyEventStatDeltas()>> <<= setup.Companion.name()>>'s lust: + <<= setup.Companion.eventLustGain()>> <<statIcon setup.StatIcon.HEALTH>><br> <<= setup.Companion.name()>>'s sanity: - <<= setup.Companion.decreaseSanity()>><<statIcon setup.StatIcon.SANITY>><br> <<if _tier gte 2>> Your <<statIcon setup.StatIcon.HEALTH>> +15<br> <<addLust 15>> <</if>> <</widget>> <<widget "isCompanionContinue">> /* Reached after the ghost ambushed the companion (showComp = ATTACK_FAILED from the single mission roll in setup.Tick.resolveCompanionAttack). The mission was already decided as a failure there, so no second success roll happens here — the companion always returns empty-handed. */ <<linkappend "@@.mc-speechLink; Will you be able to continue?@@">><br> <<if _args[0] gte _args[1] or (setup.Companion.sanity() gte _args[2] and setup.Companion.sanity() lte _args[3])>> <<run setup.Companion.resumeHunt()>> @@.notmc-speech; I think I can continue. @@ <<run setup.Companion.setChosenPlan("Plan1")>> @@.notmc-speech; <<= setup.Mc.name()>>, I'm sorry, I wasn't able to find what you asked for...@@<br> @@.mc-speech; Don't worry about it, it's okay. The main thing is that you're fine@@<br> <<companionExp 2>> <br> @@.notmc-speech; Thank you... I think I'm ready. [[Let's continue.|$return]]@@<br> <<else>> <<run setup.Companion.resumeHunt()>> @@.notmc-speech; You know... I'm not sure I can keep going. I need to rest for a bit...@@<br> @@.notmc-speech; <<= setup.Mc.name()>>, I'm sorry, I wasn't able to find what you asked for...@@<br> @@.mc-speech; Don't worry about it, it's okay. The main thing is that you're fine@@<br> <<companionExp 2>> <br> @@.mc-speech; Alright, then I'll [[continue|$return][setup.Companion.dismissCompanion()]] on my own...@@ <<if _args[0] lte 4>>@@.warningtext; Req. higher lvl@@ <</if>><br> <</if>> <</linkappend>> <</widget>> <<widget "aliceLustHighEvent">> <<set _cName to setup.Companion.name()>> or @@.usebtn;<<link `_cName + " helps you"`>><<run setup.Companion.drainSanity(3)>> <<replace "#eventVideo">><<include "AliceHelp">><</replace>> <</link>> @@ - <<= _cName>>'s <<statIcon setup.StatIcon.SANITY>> <</widget>>
<<script>> /* Thin <<addTime>>/<<addLust>> shims. Real logic lives in the owning controllers; these stay only because the widgets pass the Twee numeric arg straight through. */ setup.addTime = function (mins) { return setup.Time.addMinutes(mins); }; setup.addLust = function (amount) { setup.Mc.applyLustDelta(amount); }; /* Stat icon ids. Values double as the asset slug under ui/img/<id>.png, so the <<statIcon>> widget can resolve the image with no extra map. */ setup.StatIcon = Object.freeze({ BEAUTY: "beauty", CORRUPTION: "corruption", EMF: "emf", ENERGY: "energy", HEALTH: "hearth", SANITY: "sanity", UVL: "uvl" }); <</script>> <<widget "statIcon">> <<set _statIconId to _args[0]>> <<set _statIconGray to _args[1] is true ? "filter: grayscale(1); " : "">> <<image "ui/img/" + _statIconId + ".png" { style: "position: relative; top: 0.375em; " + _statIconGray + "width:3%; display: inline; margin: 0;" }>> <</widget>> <<widget "backOrReturn">> <<if setup.Gui.useBackInsteadOfReturn()>> @@.backbtn;<<back>>@@<br> <<else>> @@.backbtn;<<return>>@@<br> <</if>> <</widget>> <<widget "addTime">> <<set _mins to _args[0]>> <<set _crossedMidnight to setup.addTime(_mins)>> <<if _crossedMidnight>><<run setup.Tick.resetCooldowns()>><</if>> <<done>> <<replace "#time">><<= setup.Time.display()>><</replace>> <</done>> <</widget>> <<widget "addLust">> <<set _amount to _args[0]>> <<run setup.addLust(_amount)>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <</widget>> <<widget "addLustTits">> <<run setup.Mc.addLustByPart("tits", _args[0])>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <</widget>> <<widget "addLustPussy">> <<run setup.Mc.addLustByPart("pussy", _args[0])>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <</widget>> <<widget "addLustByPart">> <<set _lustBase to _args[0] !== undefined ? _args[0] : 2>> <<run setup.Mc.addLustByPart(setup.Events.currentArgForRandomizer(), _lustBase)>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <</widget>> <<widget "addSanity">> <<set _outcome to setup.Mc.applySanityDelta(_args[0])>> <<updatemeter 'sanity' `setup.Mc.sanity() / setup.Mc.sanityMax()`>> <<if _outcome is setup.SanityDeltaResult.COLLAPSED and setup.HuntController.isActive()>> <<goto setup.HuntController.huntOverPassage("sanity")>> <</if>> <</widget>> <<widget "addEnergy">> <<run setup.Mc.applyEnergyDelta(_args[0])>> <<updatemeter 'energy' `setup.Mc.energy() / setup.Mc.energyMax()`>> <</widget>> <<widget "addFit">> <<set _delta to _args[0]>> <<set _fitDelta to setup.Mc.applyFitnessDelta(_delta)>> <<if _fitDelta.beautyIncrease gt 0>> @@.mc-speech; <span class="evidenceText">Your <<statIcon setup.StatIcon.BEAUTY>> has improved (+1): <<= _fitDelta.beauty>> now!</span>@@<br> <</if>> <<if _fitDelta.energyMaxDelta gt 0 and not _fitDelta.hitEnergyCap>> @@.mc-speech; <span class="evidenceText">Your <<statIcon setup.StatIcon.ENERGY>> has increased (+<<= _fitDelta.energyMaxDelta>>): <<= _fitDelta.energyMax>> now!</span>@@<br> <</if>> <<if _fitDelta.hitEnergyCap>> @@.mc-speech; <span class="evidenceText">Your <<statIcon setup.StatIcon.ENERGY>> has reached the maximum of 20!</span>@@<br> <</if>> <<if _fitDelta.reachedFitCap>> @@.mc-thoughts; <span class="evidenceText">Your fitness level is perfect - 100</span>@@ <<else>> @@.mc-thoughts; <span class="evidenceText">Your fitness level has improved (+1): <<= _fitDelta.fit>> now!</span>@@ <</if>> <</widget>>
<<widget "applyTickEffects">> /* Wrapper for applying tick effects and updating the UI in one call. The tool-timer strip refresh is here too because tool-check completions (e.g. GWB hit -> EMF activated) land in this widget, and the sidebar caption isn't re-rendered until the next passage transition. */ <<run setup.HauntConditions.applyTickEffects()>> <<updatemeter 'sanity' `setup.Mc.sanity() / setup.Mc.sanityMax()`>> <<updatemeter 'energy' `setup.Mc.energy() / setup.Mc.energyMax()`>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <<replace "#time">><<= setup.Time.display()>><</replace>> <<replace "#tool-timers">><<= setup.toolTimerHudMarkup()>><</replace>> <<if setup.HauntConditions.isBaitOrgasmPending()>> <<goto "BaitOrgasm">> <</if>> <</widget>> /* huntTickEventChain -- arg-less. The shared "what happens between tool/nav ticks during a hunt" inner chain: lights flicker, a ghost event may roll, a steal-clothes event may roll, and a random hunt may start. */ <<widget "huntTickEventChain">> <<include "LightPassageGhost">> <<include "Event">> <<if not setup.Events.eventTriggered() and setup.HuntController.shouldTriggerSteal()>> <<run setup.HauntedHouses.markStealClothesTriggered()>> <<goto "StealClothes">> <</if>> <<if not setup.HauntedHouses.stealClothesTriggered() and not setup.Events.eventTriggered() and setup.HuntController.shouldStartRandomProwl()>> <<goto "GhostHuntEvent">> <</if>> <</widget>> /* huntTickStep -- arg-less. The shared per-nav-step chain: applies per-tick stat drains, routes to a hunt-over passage when sanity / energy / time gives out, and otherwise fires the inner event chain. */ <<widget "huntTickStep">> <<applyTickEffects>> <<run setup.HuntController.tick()>> <<if setup.Mc.isSanityCollapsed() or setup.Mc.sanity() lte 0>> <<goto setup.HuntController.huntOverPassage("sanity")>> <<elseif setup.Mc.isExhausted()>> <<goto setup.HuntController.huntOverPassage("exhaustion")>> <<else>> <<huntTickEventChain>> <</if>> <</widget>> /* Backwards-compat aliases. Old call sites in widgetHauntedHouseRoom still emit <<includeTimeEventClothesHunt>> / <<includeTimeEventHunt>> for the two nav-link variants (ironclad's "hunt" style and the default clothes-hunt style). With the steal-clothes step now gated inside <<huntTickEventChain>> via HuntController.shouldTriggerSteal, both variants resolve to the same shared widget. */ <<widget "includeTimeEventClothesHunt">><<huntTickStep>><</widget>> <<widget "includeTimeEventHunt">><<huntTickStep>><</widget>> <<widget "toolTick">> /* Tools burn 1 in-game minute per tick. Fired from inside the <<repeat>> loop in setup.searchToolMarkup so every meter increment advances the clock. Updates the clock display and tool-timer strip (linkreplace doesn't trigger StoryCaption re-render) and routes to the mode-aware hunt-over-time passage if the tick pushed dawn past 6am. */ <<run setup.addTime(1)>> <<replace "#time">><<= setup.Time.display()>><</replace>> <<replace "#tool-timers">><<= setup.toolTimerHudMarkup()>><</replace>> <<if setup.Time.hours() gte 6 and setup.HuntController.isHuntActive()>> <<goto setup.HuntController.huntOverPassage("time")>> <</if>> <</widget>> <<widget "monkeyPawWishInput">> /* <<textbox>> needs the backing var as a literal "$name" string, so the $ref is corralled here. Binds to $inputWish; the MonkeyPaw passage reads it via setup.Gui.monkeyPawWishInput(). */ <<textbox "$inputWish" "">> <</widget>> <<widget "evidenceCheckbox">> /* UI-binding wrapper: <<checkbox>> needs the backing var as a literal "$name" string, so the $ref has to live here. _args[0] is the State.variables key (e.g. "EMF5Check"). */ <<checkbox `"$" + _args[0]` false true autocheck>> <</widget>> <<widget "cthulionAbility">> <<video setup.Events.randomCthulionVideo(_args[0])>> <</widget>>
/* mcStatusBody -- inner contents of the sidebar #statusContainer (the MC clothing HUD). Split out so the per-slot click handlers in hunt mode can re-render the strip via <<replace "#statusContainer">> without rebuilding the surrounding container div. The hunt-active gate uses HuntController so the click-to-undress shortcut fires on the HuntRun passage. The fixed-outfit branch (Ironclad's warden costume) is catalogue-driven via HuntController.sidebarOutfit() -- adding a new fixed-outfit house is one catalogue field, no widget edit. */ <<widget "mcStatusBody">> <<set _outfit to setup.HuntController.sidebarOutfit()>> <<set _hunting to setup.HuntController.isHuntActive() and not _outfit>> <<if setup.Mc.isPenalized()>> <div id="inPainImg"> <<hovertip "Need to buy medicine">><<image "ui/icons/pain.jpg">><</hovertip>> </div> <</if>> <<if _outfit>> <<hovertip _outfit.tip>><<image _outfit.image>> <</hovertip>> <<else>> <div id="statusOuterTop"> <<if setup.Wardrobe.worn(setup.WardrobeSlot.TSHIRT)>> <<mcUndressIcon _hunting "tshirt" "Wearing t-shirt" "top.jpg">> <<else>> <<mcRedressIcon _hunting "tshirt" "" "empty.jpg">> <</if>> </div> <div id="statusOuterBottom"> <<set _bottom to setup.Wardrobe.currentBottomDescriptor()>> <<if _bottom>> <<mcUndressIcon _hunting `setup.Wardrobe.currentBottomSlotName()` _bottom.tip _bottom.icon>> <<else>> <<mcRedressIcon _hunting "bottomOuter" "" "empty.jpg">> <</if>> </div> <div id="statusUnderTop"> <<if setup.Wardrobe.worn(setup.WardrobeSlot.BRA)>> <<mcUndressIcon _hunting "bra" "Wearing bra." "bra.jpg">> <<else>> <<mcRedressIcon _hunting "bra" "No bra on!" "tits.jpg">> <</if>> </div> <div id="statusUnderBottom"> <<if setup.Wardrobe.worn(setup.WardrobeSlot.PANTIES)>> <<mcUndressIcon _hunting "panties" "Wearing panties" "panties.jpg">> <<else>> <<mcRedressIcon _hunting "panties" "No panties on!" "nude.jpg">> <</if>> </div> <</if>> <</widget>> /* mcUndressIcon -- "currently wearing X" sidebar icon. During a hunt the icon becomes a click target that takes the garment off and re-renders the strip; outside of hunts it's the original hovertip + image. Args: hunting, slotName, hoverText, iconFile. */ <<widget "mcUndressIcon">> <<set _hunting to _args[0]>> <<set _slot to _args[1]>> <<set _tip to _args[2]>> <<set _icon to _args[3]>> <<if _hunting>> <<set _label to `<<image "ui/icons/${_icon}">>`>> <<capture _slot>> <<hovertip `_tip + " — click to take it off"`>> <<link _label>> <<run setup.Wardrobe.quickUndress(_slot)>> <<replace "#statusContainer">><<mcStatusBody>><</replace>> <</link>> <</hovertip>> <</capture>> <<else>> <<hovertip _tip>><<image "ui/icons/" + _icon>><</hovertip>> <</if>> <</widget>> /* mcRedressIcon -- "currently not wearing X" sidebar icon. Mirrors mcUndressIcon, but only becomes a link when the slot has a remembered last-worn item to put back on. tip "" suppresses the hovertip (preserves the existing tshirt/bottom empty cells). */ <<widget "mcRedressIcon">> <<set _hunting to _args[0]>> <<set _slot to _args[1]>> <<set _tip to _args[2]>> <<set _icon to _args[3]>> <<set _canRedress to _hunting and setup.Wardrobe.canQuickRedress(_slot)>> <<if _canRedress>> <<set _redressTip to _tip eq "" ? "Click to put it back on" : _tip + " — click to put it back on">> <<set _label to `<<image "ui/icons/${_icon}">>`>> <<capture _slot>> <<hovertip _redressTip>> <<link _label>> <<run setup.Wardrobe.quickRedress(_slot)>> <<replace "#statusContainer">><<mcStatusBody>><</replace>> <</link>> <</hovertip>> <</capture>> <<elseif _tip neq "">> <<hovertip _tip>><<image "ui/icons/" + _icon>><</hovertip>> <<else>> <<image "ui/icons/" + _icon>> <</if>> <</widget>>
<<widget "ghostRoom">> <<set _roomLabel to setup.Ghosts.huntRoomName()>> <<if _roomLabel eq "">> <<set _roomLabel to setup.HuntController.ghostRoomLabel()>> <</if>> <<if _roomLabel neq "">> <b><<= _roomLabel.toLowerCase()>></b> <</if>> <</widget>>
/* monkeyPawWish -- dispatcher for Monkey Paw wish effects. Takes the widget name to invoke (one of "activity", "trapTheGhost", "sanity", "leave", "knowledge", "dawn") and wikifies the matching <<widgetName>> call. Lets MonkeyPaw.tw iterate its wish catalogue and pick the effect widget by name instead of branching on the id. Each effect widget below is a thin view layer: it calls setup.MonkeyPaw.activate(id), which does all state mutations and wish-count bookkeeping, and then renders off the returned hints (video, narrative, goto, stat deltas). Severity scaling lives in the controller; these widgets only know how to paint the result. */ <<widget "monkeyPawWish">> <<= "<<" + _args[0] + ">>">> <</widget>> /* Shared tail: meter refresh + Return button. Used by the in-place wish widgets (activity, trapTheGhost, sanity). */ <<widget "monkeyPawTail">> <<updatemeter 'mclust' `setup.Mc.lustPct()`>> <<updatemeter 'sanity' `setup.Mc.sanityPct()`>> <br> @@.backbtn;<<link "Return" `passage()`>> <</link>>@@ <</widget>> <<widget "activity">> <<replace ".MonkeyPawShow">> <<set _out to setup.MonkeyPaw.activate("activity")>> <<video _out.video "displayCentredImgs">> @@.mc-speech; <<= _out.narrative>>@@<br> @@.mc-thoughts; Lust increased: +<<= _out.lustDelta>> <<statIcon setup.StatIcon.HEALTH>>@@<br> @@.mc-thoughts; Sanity decreased: <<= _out.sanityDelta>> <<statIcon setup.StatIcon.SANITY>>@@<br> <<if _out.corrDelta>> @@.mc-thoughts; Corruption banking: +<<= _out.corrDelta>>@@<br> <</if>> <<if _out.drewGhost>> @@.mc-thoughts; <b>Something is in the room with me now.</b>@@<br> <</if>> <br> <<monkeyPawTail>> <</replace>> <</widget>> <<widget "trapTheGhost">> <<replace "#wishesCount">> <<set _out to setup.MonkeyPaw.activate("trapTheGhost")>> @@.mc-thoughts; <<= setup.MonkeyPaw.wishesLeft()>> wishes left...@@<br><br> @@.mc-speech; <<= _out.narrative>>@@<br> <b>@@.mc-thoughts; Sanity decreased: <<= _out.sanityDelta>> <<statIcon setup.StatIcon.SANITY>>@@</b><br> <<if _out.corrDelta>> @@.mc-thoughts; Corruption banking: +<<= _out.corrDelta>>@@<br> <</if>> <<if _out.drewGhost>> @@.mc-thoughts; <b>The ghost is in the room with me now.</b>@@<br> <</if>> <<monkeyPawTail>> <</replace>> <</widget>> <<widget "sanity">> <<replace "#wishesCount">> <<set _out to setup.MonkeyPaw.activate("sanity")>> @@.mc-thoughts; <<= setup.MonkeyPaw.wishesLeft()>> wishes left...@@<br><br> <b>@@.mc-thoughts; Sanity set to <<= _out.sanitySet>> <<statIcon setup.StatIcon.SANITY>> now!@@</b><br> @@.mc-speech; <<= _out.narrative>>@@<br> <<if _out.lustDelta>> @@.mc-thoughts; Lust increased: +<<= _out.lustDelta>> <<statIcon setup.StatIcon.HEALTH>>@@<br> <</if>> <<if _out.corrDelta>> @@.mc-thoughts; Corruption banking: +<<= _out.corrDelta>>@@<br> <</if>> <<monkeyPawTail>> <</replace>> <</widget>> <<widget "leave">> <<set _out to setup.MonkeyPaw.activate("leave")>> <<if _out.clothesStolen>> <<run setup.HauntedHouses.markClothesStolen()>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.TSHIRT)>><<run setup.Wardrobe.stealWornInGroup("tshirt", "tshirtState", "isShirtStolen")>><</if>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.BRA)>><<include "StealBra">><</if>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.JEANS) or setup.Wardrobe.worn(setup.WardrobeSlot.SHORTS) or setup.Wardrobe.worn(setup.WardrobeSlot.SKIRT)>> <<include "StealBottomOuter">> <</if>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.PANTIES)>><<include "StealPanties">><</if>> <</if>> <<if _out.goto>> <<goto _out.goto>> <</if>> <</widget>> <<widget "knowledge">> <<replace "#wishesCount">> <<set _out to setup.MonkeyPaw.activate("knowledge")>> <<if _out.alreadyUsed>> @@.mc-speech; Nothing happened... I probably won't be able to remove more than one piece of evidence@@<br><br><br> @@.backbtn;<<link "Return" `passage()`>> <</link>>@@ <<else>> @@.mc-thoughts; <<= setup.MonkeyPaw.wishesLeft()>> wishes left...@@<br><br> @@.mc-speech; <<= _out.narrative>>@@ <<if _out.sanityDelta>> <br>@@.mc-thoughts; Sanity decreased: <<= _out.sanityDelta>> <<statIcon setup.StatIcon.SANITY>>@@ <<updatemeter 'sanity' `setup.Mc.sanityPct()`>> <</if>> <<if _out.goto>> <br>@@.enterbtn;<<link "Brace yourself" _out.goto>> <</link>>@@ <</if>> <</if>> <</replace>> <</widget>> <<widget "dawn">> <<set _out to setup.MonkeyPaw.activate("dawn")>> <<if _out.goto>> <<goto _out.goto>> <</if>> <</widget>> /* Shared exit link for every hunt-ending scene in HuntEnd.tw. With a classic high-priestess tarot active, the card burns itself to return the MC to $return; absent that, the next-passage target is delegated to setup.HuntController.huntCaughtPassage() so classic sleeps the MC home and a hunt stamps a "caught" failure and routes to HuntSummary. `_args[0]` is the link text ("fading into darkness", "plunging you into darkness", "nothing"). */ <<widget "huntEndExit">> <<if setup.Ghosts.hasHighPriestess()>> @@.usebtn;<<link _args[0] $return>> <<run setup.Ghosts.consumeHighPriestess()>> <</link>>@@ <<else>> @@.usebtn;<<link _args[0] setup.HuntController.huntCaughtPassage()>> <</link>>@@ <</if>> <</widget>>
<<widget "webcamEvent">> <<set _wce to setup.Home.webcamEvent()>> <<if _wce eq "tease">> @@.mc-thoughts; You start your webcam show. For an hour, you show yourself in various poses.@@<br> @@.mc-speech; Do you guys like this? Oh~ I'm so wet. I wish someone would lick my juicy pussy. @@<br> +60 <<statIcon setup.StatIcon.HEALTH>> <br> <<addLust 60>> <<addTime 60>> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <<elseif _wce eq "masturbate">> @@.mc-thoughts; You start your webcam show. For an hour, you show yourself in various poses, masturbating your pussy.@@<br> @@.mc-speech; ~Ahh~I'm cu... ~Ohhhh fuck~ that was awesome. I hope you guys enjoyed the show too@@<br> +60 <<statIcon setup.StatIcon.HEALTH>> <br> <<addLust 60>> <<addTime 60>> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <<elseif _wce eq "toypussy">> @@.mc-thoughts; You start your webcam show. For an hour, you show yourself in various poses, fucking your pussy with a toy.@@<br> @@.mc-speech; ~Ahh~I'm cu... ~Ohhhh fuck~ that was awesome. I hope you guys enjoyed the show too@@<br> +60 <<statIcon setup.StatIcon.HEALTH>> <br> <<addLust 60>> <<addTime 60>> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <<elseif _wce eq "toyanal">> @@.mc-thoughts; You start your webcam show. For an hour, you show yourself in various poses, fucking your ass with a toy.@@<br> @@.mc-speech; ~Ahh~I'm cu... ~Ohhhh fuck~ that was awesome. I hope you guys enjoyed the show too@@<br> +60 <<statIcon setup.StatIcon.HEALTH>> <br> <<addLust 60>> <<addTime 60>> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <<elseif _wce eq "fingeranal">> @@.mc-thoughts; You start your webcam show. For an hour, you show yourself in various poses, fingering your asshole.@@<br> @@.mc-speech; ~Ahh~I'm cu... ~Ohhhh fuck~ that was awesome. I hope you guys enjoyed the show too@@<br> +60 <<statIcon setup.StatIcon.HEALTH>> <br> <<addLust 60>> <<addTime 60>> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <</if>> <<run setup.Home.setWebcamCooldown(1)>> <</widget>>
<<image "scenes/gym/emily-talks.jpg" { width: "100%" }>><br> <<if not setup.Gym.hasMetEmily()>> @@.mc-speech; Hi, you look really fit. You must work out a lot. Oh, I forgot to introduce myself: I'm <<= setup.Mc.name()>>.@@<br> @@.notmc-speech; Hey <<= setup.Mc.name()>>. I'm Emily. Yes, you're right@@<br> @@.mc-thoughts; You start chatting about various topics.@@<br> <br> <<run setup.Gym.greetEmilyFirstTime()>> Relation with @@.mc-speech;Emily@@ improved: <<= setup.Gym.emilyRelationshipStage()>> now! <<elseif setup.Gym.emilyRelationshipStage() lte 4>> <<set _check to random(1,3)>> <<if _check eq 1>>@@.mc-speech; Do you have any tips for staying motivated?<br>@@ @@.notmc-speech; I find setting small goals really helps.<br>@@ <</if>> <<if _check eq 2>>@@.notmc-speech; You can work out on your own, but training with a coach will be more beneficial, although it does cost money.<br>@@ @@.mc-speech; Thanks for mentioning it. I'll keep that in mind.<br>@@ <</if>> <<if _check eq 3>> @@.notmc-speech; There are group classes here, held daily from 12 PM to 14 PM. They are free and very effective.<br>@@ @@.mc-speech; Thanks for mentioning it. I'll keep that in mind.<br>@@ <</if>> <<if setup.Gym.raiseEmilyRelationship()>> Relation with @@.mc-speech;Emily@@ improved: <<= setup.Gym.emilyRelationshipStage()>> now!<br> <</if>> <<elseif setup.Gym.emilyRelationshipStage() gte 5>> <<set _check to random(1,3)>> <<if _check eq 1>>@@.mc-speech; Why do you work out in the evening?<br>@@ @@.notmc-speech; I used to work out at any time of the day, but now I prefer training with a female coach.<br>@@ <</if>> <<if _check eq 2>>@@.notmc-speech; Have you seen the trainer who works here in the morning? Well... I heard that he goes crazy for girls in pretty lingerie, so I took advantage of that. Now I'm training with him for free.<br>@@ @@.mc-speech; I think I understand what you mean. Maybe I'll take advantage of that too.<br>@@ <<run setup.Gym.markTrainer1Tipped()>> <</if>> <<if _check eq 3>> @@.notmc-speech; Do you know the trainer who works here during the day? He likes girls who are in good shape.<br>@@ @@.mc-speech; Thanks for mentioning it. I'll keep that in mind.<br>@@ <</if>> <<if setup.Gym.raiseEmilyRelationship()>> Relation with @@.mc-speech;Emily@@ improved: <<= setup.Gym.emilyRelationshipStage()>> now!<br> <</if>> <</if>> <br> <br> @@.backbtn;[[Leave|GymInside]] @@ <<run setup.Gym.startEmilyCooldown()>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<addTime 60>> <<randomVideo "scenes/gym/group.mp4" "scenes/gym/group1.mp4">> You spent about an hour at the gym, diligently working on improving your physical fitness. Each workout makes you stronger and more resilient, helping you reach new heights.<br> <<if setup.Gym.meetsBeautyForGroupEvent()>> @@.mc-thoughts; Suddenly, you were@@ <<linkappend "@@.mc-thoughtsLink; surrounded by all the members of the group class@@.">><br> <<video "scenes/gym/grouptraining1.mp4">> <<addLust 15>> @@.notmc-speech;The class is almost over, and now we want to relax a bit. You'll help us out, won't you, sweetheart?@@<br> @@.mc-thoughts; With these words they began to lightly touch your body, kissing and biting your tits and pussy @@<br> <<if setup.Gym.canJoinGroupOrgy()>> @@.mc-speech; I'm so horny...and they start rubbing my pussy right now....<br> Oooh, [[I can't resist|GymGroupEvent1Start]]@@<br> <<else>> @@.mc-speech; No, sorry I'm [[not in the mood.|GymInside]]@@<br>@@.warningtext; (Req. <<statIcon setup.StatIcon.HEALTH>> ≥ 50)@@ <</if>> <</linkappend>> <br> <<else>>@@.warningtext; (Req. <<statIcon setup.StatIcon.BEAUTY>> ≥ 50)@@<br><br>@@.backbtn;[[Back|GymInside]] @@<br> <</if>> <<gymFitnessGain 2>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<image "ui/img/gym.jpg" { width: "85%" }>> <br> @@.location; Gym@@<br> @@.mc-thoughts; This gym is the only one in the city. It is well-equipped and suitable for both beginners and professionals. Overall, it has everything needed to achieve a fit and athletic body. @@<br> <br> <<if not setup.Gym.isOpen()>> @@.mc-thoughts; The gym is not open right now (open from 8 AM to 10 PM)@@ <<else>> @@.enterbtn;[[Inside|GymInside]]@@ <</if>> <br> <br> @@.backbtn;[[Leave|CityMap]]@@ <br> <<if previous(2) is "Gym">><<addTime 0.5>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 0.5>><</if>>
<<addLust 15>> <<video "scenes/gym/grouptraining1.1.mp4">> @@.mc-speech; Oh ~fuck~ this is so good~@@<br> @@.notmc-speech; Relax baby, we're just getting started. We have some @@ <<linkappend "@@.notmc-speechLink;toys for you@@">> <br> <<set _check to random(1,3)>> <<if _check eq 1>><<video "scenes/gym/grouptraining1.2.mp4">> <</if>> <<if _check eq 2>><<video "scenes/gym/grouptraining1.3.mp4">> <</if>> <<if _check eq 3>><<video "scenes/gym/grouptraining1.4.mp4">> <</if>> @@.mc-speech; It's amazing~ Keep going, please~@@<br> @@.mc-thoughts; The group sports session turned into an [[orgy|GymGroupEvent1Start2]]@@<br> <</linkappend>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <br>
<<addLust 15>> <<addTime 60>> <<randomVideo "scenes/gym/grouptraining1.5.mp4" "scenes/gym/grouptraining1.6.mp4">> @@.mc-thoughts; First someone fucked you, then you started fucking someone else with a toy.<br> Eventually everyone @@<<linkappend "@@.mc-thoughtsLink; gathered around you again.@@">> <br> <<video "scenes/gym/grouptraining1end.mp4">> @@.notmc-speech; Yes~Finger your juicy pussy.@@ <br> @@.mc-speech; Fuck~ i'm about to~@@<br> @@.mc-thoughts; You're squirting, almost losing consciousness from the overwhelming pleasure.@@<br> @@.mc-speech; Oh, thank you girls, I will try to come to you more often@@<br> <<run setup.Mc.setLust(0)>> <<updatemeter 'mclust' `setup.Mc.lust().toFixed(2) / 100`>> <<gainXP 10 0.5>> @@.backbtn;[[Leave|GymInside]] @@ <</linkappend>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <br>
<<run setup.Gym.setTrainingCost(setup.Gym.computeTrainingCost())>> <<image "ui/img/gym-inside.jpg" { width: "100%" }>> <br> <<if not setup.Gym.isOpen()>> @@.mc-thoughts; It's time to go, there's no one here@@<br> <<else>> <<if setup.Gym.hasSportswear()>> <<if setup.Gym.hasEnergyToTrain()>><span class="movebtn">[[Train solo|GymTraining][setup.Gym.spendEnergyToTrain()]]</span><span><<statIcon setup.StatIcon.ENERGY>></span><<else>> @@.mc-thoughts; I'm too tired to train solo@@ <span><<statIcon setup.StatIcon.ENERGY true>></span> <</if>><br> <<if setup.Gym.hasEnergyToTrain()>> <<if setup.Gym.canAffordCoach()>> <span class="movebtn">[[Train with a coach|GymTrainingTrainer][setup.Gym.spendEnergyToTrain()]]</span><span><<statIcon setup.StatIcon.ENERGY>></span> <span class="priceAmount">-<<= setup.Gym.trainingCost()>> $</span> <<else>> @@.mc-thoughts; I don't have enough money for a training session with a coach@@ <</if>> <<else>> @@.mc-thoughts; I'm too tired to train with a coach@@ <span><<statIcon setup.StatIcon.ENERGY true>></span> <</if>><br> <<if setup.Gym.isGroupClassTime()>> <<if setup.Gym.hasEnergyToTrain()>><span class="movebtn">[[Group fitness classes|GroupGymTraining][setup.Gym.spendEnergyToTrain()]]</span><span><<statIcon setup.StatIcon.ENERGY>></span> <<else>> @@.mc-thoughts; I'm too tired to train@@<span><<statIcon setup.StatIcon.ENERGY true>></span> <</if>> <</if>> <br> <br> <<else>> @@.mc-thoughts; I need sportswear to work out at the gym@@<br> <</if>> <</if>> <br> @@.backbtn;[[Leave|CityMap]] @@<br> <br>
<<if setup.Gym.soloSlotMorning()>> <<video "scenes/gym/solo1.mp4">> You spent about an hour at the gym, diligently working on improving your physical fitness. Each workout makes you stronger and more resilient, helping you reach new heights.<br><br> <<elseif setup.Gym.soloSlotAfternoon()>> <<video "scenes/gym/solo2.mp4">> You spent about an hour at the gym, diligently working on improving your physical fitness. Each workout makes you stronger and more resilient, helping you reach new heights.<br><br> <<elseif setup.Gym.soloSlotEvening()>> <<video "scenes/gym/solo3.mp4">> You spent about an hour at the gym, diligently working on improving your physical fitness. Each workout makes you stronger and more resilient, helping you reach new heights.<br><br> <<if not setup.Gym.hasMetEmily()>> You see the girl who works out here almost every evening.<br> @@.mc-speech; Maybe I should [[talk to her?|EmilyTalk]]. I'd like to chat with someone, and she might have something interesting to share.@@<br> <<else>> You see @@.mc-speech;Emily@@. @@.mc-speech;[[Go talk to her|EmilyTalk]]@@ after the workout.<br><br> <</if>> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<addLust 15>> <<if setup.Gym.soloSlotMorning()>> <<video "scenes/gym/trainer1.mp4">> You spent about an hour at the gym, diligently working on improving your physical fitness. Each workout makes you stronger and more resilient, helping you reach new heights.<br><br> <<if setup.Gym.trainer1GaveTip()>> @@.mc-thoughts; Emily said that he likes girls in sexy lingerie...@@<br> <</if>> <<if setup.Gym.trainer1OnCooldown()>> @@.mc-thoughts; Enough for today.@@<br> <<elseif setup.Gym.canTriggerTrainer1Event()>> @@.mc-speech;[[Go to him in sexy lingerie|GymTrainerEvent1Start]]@@ <</if>> <<elseif setup.Gym.soloSlotAfternoon()>> <<video "scenes/gym/trainer2.mp4">> You spent about an hour at the gym, diligently working on improving your physical fitness. Each workout makes you stronger and more resilient, helping you reach new heights.<br><br> <<if setup.Gym.meetsFitForTrainer2Event()>> @@.mc-thoughts; While you're squatting with him, you feel his cock pressing directly@@ <<linkappend "@@.mc-thoughtsLink; into your butt.@@">><br> @@.mc-speech; It seems like I can feel that you enjoy working out with me.@@<br> @@.notmc-speech; Oh, sorry, we can stop if you want...@@<br> <<if setup.Gym.trainer2OnCooldown()>> @@.mc-speech; Yes, I'm [[not in the mood.|GymInside]]@@<br>@@.mc-thoughts; Enough for today.@@<br> <<else>> @@.mc-speech; No, let me [[help you.|GymTrainerEvent2Start]]@@ or @@.mc-speech; Yes, I'm [[not in the mood.|GymInside]]@@<br> <</if>> <</linkappend>> <</if>> <<elseif setup.Gym.soloSlotEvening()>> <<video "scenes/gym/trainer3.mp4">> You spent about an hour at the gym, diligently working on improving your physical fitness. Each workout makes you stronger and more resilient, helping you reach new heights.<br><br> <<if not setup.Gym.hasMetEmily()>> You see the girl who works out here almost every evening.<br> @@.mc-speech; Maybe I should [[talk to her?|EmilyTalk]]. I'd like to chat with someone, and she might have something interesting to share.@@<br> <<else>> You see @@.mc-speech;Emily@@. @@.mc-speech;[[Go talk to her|EmilyTalk]]@@ after the workout.<br> <</if>> <</if>> <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<addLust 15>> <<run setup.Gym.markTrainer1Coaching()>> <<set _check to random(1,2)>> <<if _check eq 1>><<video "scenes/gym/trainer1event1.mp4">> <</if>> <<if _check eq 2>><<image "scenes/gym/trainer1event1.jpg" { width: "100%" }>> <</if>> @@.mc-speech; Do you like how I look?@@<br> @@.notmc-speech; I... you... @@<br> <<linkreplace "@@.mc-speechLink; Start sucking his dick@@">> <<set _check to random(1,2)>> <<if _check eq 1>><<video "scenes/gym/trainer1event1.1.mp4">> <</if>> <<if _check eq 2>><<video "scenes/gym/trainer1event1.2.mp4">> <</if>> @@.mc-speech; AGH~gulp~galp~@@<br> @@.notmc-speech; Yessss, just like that...Now i'm gonna [[fuck you|GymTrainerEvent1Start1]]@@<br> <</linkreplace>> <br>
<<addLust 30>> <<set _check to random(1,2)>> <<if _check eq 1>><<video "scenes/gym/trainer1event1.3.mp4">> <</if>> <<if _check eq 2>><<video "scenes/gym/trainer1event1.4.mp4">> <</if>> @@.mc-speech; Ohhhh god, yes~ fuck me harder~yesss@@<br> @@.notmc-speech; I'll fuck all your@@ <<linkappend "@@.notmc-speechLink; holes@@">><br> <<set _check to random(1,2)>> <<if _check eq 1>><<video "scenes/gym/trainer1event1.5.mp4">> <</if>> <<if _check eq 2>><<video "scenes/gym/trainer1event1.6.mp4">> <</if>> @@.mc-speech; Do you like the way I bounce my ass on your dick?@@<br> @@.notmc-speech; Oh, that's so fucking awesome. I'm about to [[ cum|GymTrainerEvent1Start2]]@@<br> <</linkappend>> <br> <<run setup.Gym.markTrainer1Coaching()>>
<<addLust 15>> <<run setup.Gym.startTrainer1SexCooldown()>> <<video "scenes/gym/trainer1event1end.mp4">> <<if not setup.Gym.trainer1Discounted()>> @@.notmc-speech; Oh, it's been a while since I've had this... You know what, you can come train with me for free. And... don't forget to bring your sexy underwear, we can do this again.@@ <<run setup.Gym.applyTrainer1Discount()>><br> <<else>> @@.notmc-speech; You are as gorgeous as always. But I have to work.@@<br> <</if>> @@.mc-speech; Oh, sure, I'll come later.@@<br> <<gainXP 10 0.5>> @@.backbtn;[[Leave|GymInside]] @@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<addLust 15>> <<set _check to random(1,2)>> <<if _check eq 1>><<video "scenes/gym/trainer2event2.1.mp4">> <</if>> <<if _check eq 2>><<video "scenes/gym/trainer2event2.2.mp4">> <</if>> @@.notmc-speech; Yes~ suck it, you are such a slut @@<br> @@.mc-speech; Gulp~guulp~AGH~@@<br> @@.notmc-speech; Now I'm going to fuck you@@ <<linkappend "@@.notmc-speechLink;in the ass@@">> <<addLust 30>> <<set _check to random(1,3)>> <<if _check eq 1>><<video "scenes/gym/trainer2event2.3.mp4">> <</if>> <<if _check eq 2>><<video "scenes/gym/trainer2event2.4.mp4">> <</if>> <<if _check eq 3>><<video "scenes/gym/trainer2event2.5.mp4">> <</if>> @@.notmc-speech; Oh~ i'm cumming, open your fucking [[mouth|GymTrainerEvent2Start2]]@@<br> <</linkappend>> <br>
<<addLust 15>> <<run setup.Gym.startTrainer2SexCooldown()>> <<video "scenes/gym/trainer2event2end.mp4">> @@.notmc-speech; Phew~ thanks for the "help". I guess we can do that again sometimes.@@ <br> @@.mc-speech; Oh, sure, I'll come later.@@<br> <<gainXP 10 0.5>> @@.backbtn;[[Leave|GymInside]] @@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<addTime 60>> <<include "GymSolo">> <<gymFitnessGain 1>> <br> <br> @@.backbtn;[[Back|GymInside]] @@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<run setup.Gym.payForCoach()>> <<addTime 60>> <<include "GymTrainer">> <<gymFitnessGain 2>> <br> <br> @@.backbtn;[[Back|GymInside]] @@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<widget "gymFitnessGain">> <<set _fitGain to _args[0]>> <<set _gymDelta to setup.Gym.applyFitnessGain(_fitGain)>> <<if _gymDelta.beautyIncrease gt 0>> @@.mc-speech; <span class="evidenceText">Your <<statIcon setup.StatIcon.BEAUTY>> has improved (+1): <<= _gymDelta.beauty>> now!</span>@@<br> <</if>> <<if _gymDelta.energyMaxDelta gt 0 and not _gymDelta.hitEnergyCap>> @@.mc-speech; <span class="evidenceText">Your <<statIcon setup.StatIcon.ENERGY>> has increased (+<<= _gymDelta.energyMaxDelta>>): <<= _gymDelta.energyMax>> now!</span>@@<br> <</if>> <<if _gymDelta.hitEnergyCap>> @@.mc-speech; <span class="evidenceText">Your <<statIcon setup.StatIcon.ENERGY>> has reached the maximum of 20!</span>@@<br> <</if>> <<if _gymDelta.reachedFitCap>> @@.mc-speech; <span class="evidenceText">Your fitness level is perfect - 100</span>@@ <<else>> @@.mc-speech; <span class="evidenceText">Your fitness level has improved (+_fitGain): <<= _gymDelta.fit>> now!</span>@@ <</if>> <</widget>>
/* Triggered when the bait mechanic stamps lust onto an MC who was already * at 100. consumeBaitOrgasm zeros lust and bleeds 10 sanity but * intentionally leaves $baitActive / $baitStepsRemain alone — the ghost * stays pinned for whatever bait turns are left. The pending flag is * raised in setup.HauntConditions.applyTickEffects (movement + tool * measurement) and in startBait (the +20 click), and is consumed here * exactly once per fire. */ <<run setup.HauntConditions.consumeBaitOrgasm()>> <<updatemeter 'sanity' `setup.Mc.sanityPct()`>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <<if setup.Mc.isSanityCollapsed() or setup.Mc.sanity() lte 0>> <<goto setup.HuntController.huntOverPassage("sanity")>> <</if>> <<randRangeVideo "mechanics/orgasm/solo" 1 12 ".mp4">> <br> @@.mc-thoughts; The pressure snaps. Your fingers are between your thighs before you even register moving them, and the room tilts. Your knees give. You hit the floor hard, every muscle locked tight as the orgasm rips through you in shuddering waves.@@<br> <<linkreplace `"@@.mc-speech; A-ahh~ I can't — I can't stop —!@@"`>> @@.mc-speech; A-ahh~ I can't — I can't stop —!@@<br> <<randRangeVideo "mechanics/cum-covered/laying-down" 1 5 ".mp4">> <br> @@.mc-thoughts; As you lay lost in yourself, above you, the air thickens. Something cold and slick spatters across your skin in long, sticky ropes. Your face burns with desire. Your head swims in ecstasy. You lose a piece of your mind in the haze.@@<br> <br> @@.backbtn;[[Pull yourself up|$return]]@@ <</linkreplace>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* Shared landing for an ectoplasm hit during a hunt. setup.ToolController.renderPlasm() stamps the find on $evidenceFind = { tool, pack, message } and emits a deferred <<goto>> here. The destination always uses the messy plasm pack so the MC line below ("now its all over me") makes sense; the wardrobe-conditional 1..7 / 8..14 range mirrors renderPlasm's mess branch. The "noreturn" tag keeps this passage out of $return, so [[Back|$return]] takes the player back to the HuntRun passage without bouncing through here. */ <<set _range to setup.Wardrobe.worn(setup.WardrobeSlot.TSHIRT) ? [1, 7] : [8, 14]>> <<randRangeImg "mechanics/plasm/mess/" _range[0] _range[1] ".png" "displayCentredImgs">> <br> @@.mc-thoughts; great... now its all over me@@<br> <br> @@.backbtn; [[Back|$return]]@@
/* Shared landing for a GWB hit during a hunt. setup.ToolController.renderGwb() stamps the find on $evidenceFind and emits a deferred <<goto>> here. Image pack and reaction text match the inline copy renderGwb used to wikify -- moving them into a passage keeps the post-find beat consistent with the ectoplasm flow without rewriting the renderer. */ <<randRangeImg "mechanics/gwb/" 1 18 ".jpg">> <br> @@.mc-speech; <span class="evidenceshadowtext"> Ohh... what is this...? Nevertheless, one more piece of evidence</span>@@<br> <br> @@.backbtn; [[Back|$return]]@@
@@.mc-thoughts; You try to find something, but it seems like nothing is there. Suddenly, you feel an unusual warmth emanating from one of the objects. As you get closer and touch it, the warmth intensifies, spreading throughout your body like an internal heat. Only when you bring the object closer to yourself do you realize that @@@@.mc-speech;<<linkappend "it is a ">><br> <<set _found to setup.Companion.rollFoundCursedItem()>> @@.mc-speech; <<= _found.speech>>@@<br> <<image _found.img { width: "30%" }>> <br> Well, the cursed and mysterious item turns out to be... this. I'm not surprised. Well, I'll need to take it to the witch. <br> Damn, as soon as I picked up this item, I immediately felt more... aroused.<br> +30 <<statIcon setup.StatIcon.HEALTH>><br><<addLust 30>> [[Continue investigating the house|previous()]] Or perhaps... <<linkreplace "Use it">> <<include "UseCursedItem">> <</linkreplace>><br> <</linkappend>>@@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
@@.mc-thoughts; You found your stolen clothes.@@<br> <br> <<if setup.Mc.exhibitionism() gte 5>> @@.mc-speech; Or... maybe I shouldn't put on clothes... I've kind of gotten used to being naked...<br> I can pick it up later. Hopefully, it won't disappear...@@<br> <<linkreplace "@@.mc-speechLink; Nah... I should get dressed@@">> <br> @@.mc-action; You put on your clothes.@@<br><br> <<set _vid to setup.HauntedHouses.findStolenDressupVideo()>> <<if _vid>> <<video _vid "displayCentredImgs">> <</if>> <<if setup.Wardrobe.isPantiesStolen()>><<run setup.Wardrobe.restoreStolenInGroup("panties", "isPantiesStolen")>><</if>> <<if setup.Wardrobe.isBottomStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bottomOuter")>><<run State.variables.isBottomStolen = 0>><<run State.variables.isJeansStolen = 0>><<run State.variables.isShortsStolen = 0>><<run State.variables.isSkirtStolen = 0>><</if>> <<if setup.Wardrobe.isShirtStolen()>><<run setup.Wardrobe.restoreStolenInGroup("tshirt", "isShirtStolen")>><</if>> <<if setup.Wardrobe.isBraStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bra", "isBraStolen")>><</if>> <<run setup.HauntedHouses.clearClothesStolenFlag()>> <</linkreplace>> <<else>> @@.mc-action; You put on your clothes.@@<br><br> <<set _vid to setup.HauntedHouses.findStolenDressupVideo()>> <<if _vid>> <<video _vid "displayCentredImgs">> <</if>> <<if setup.Wardrobe.isPantiesStolen()>><<run setup.Wardrobe.restoreStolenInGroup("panties", "isPantiesStolen")>><</if>> <<if setup.Wardrobe.isBottomStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bottomOuter")>><<run State.variables.isBottomStolen = 0>><<run State.variables.isJeansStolen = 0>><<run State.variables.isShortsStolen = 0>><<run State.variables.isSkirtStolen = 0>><</if>> <<if setup.Wardrobe.isShirtStolen()>><<run setup.Wardrobe.restoreStolenInGroup("tshirt", "isShirtStolen")>><</if>> <<if setup.Wardrobe.isBraStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bra", "isBraStolen")>><</if>> <<run setup.HauntedHouses.clearClothesStolenFlag()>> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* Freeze-and-let-it-pass: third branch alongside Run / Hide. Pays a * clothing item + a bank of tempCorr and returns "free evidence" for * whichever timed tool was active — EMF/UVL get their window popped open * so the next tick auto-reads, mirroring how a ghost event normally opens * those windows. With nothing left to give, the ghost takes the player * instead and routes to HuntOverSanity. Strips via the canonical * Wardrobe.stealWornInGroup / StealBottomOuter / StealPanties / StealBra * passages so wardrobe variant state + rememberTopOuter/rememberBottomOuter * stay consistent. */ <<script>> (function () { var V = State.variables; var WORN = setup.ClothingState.WORN; var slots = []; if (V.tshirtState === WORN) slots.push("top"); if (V.jeansState === WORN || V.shortsState === WORN || V.skirtState === WORN) slots.push("bottom"); if (V.pantiesState === WORN) slots.push("panties"); if (V.braState === WORN) slots.push("bra"); State.temporary.freezeSlot = slots.length ? slots[Math.floor(Math.random() * slots.length)] : ""; })(); <</script>> <<if _freezeSlot eq "">>   You don't run. You don't hide. You hold perfectly still and let it pass THROUGH you. Icy fingers slide over bare skin — and find nothing left to tear away. The ghost pauses. Then, curious and patient, it decides to take you instead.<br> @@.mc-thoughts;You feel the cold close around you and pull. There is nothing left to give but yourself.@@ <<run setup.HauntedHouses.rearmHuntTimer()>> <br><br> @@.usebtn;<<link "Surrender to the cold" setup.HuntController.huntOverPassage("sanity")>> <</link>>@@ <<else>> <<run setup.Mc.addTempCorr(0.5)>> <<run setup.activateTool("emf")>> <<run setup.activateTool("uvl")>> /% Mirror StealClothes: stash a clothesStolen pin onto the floor plan and flip isClothesStolen=1 so the find-stolen-clothes UI surfaces the dropped garment somewhere in the house. %/ <<run setup.HuntController.stashStolenClothes()>> <<run setup.HauntedHouses.markClothesStolen()>>   You don't run. You don't hide. You hold perfectly still and let it pass THROUGH you. Icy fingers slide over you; the ghost pauses, curious — and tears a garment loose before drifting on. Your skin crawls, but you can feel the residue it left behind. Every tool you were carrying picks up the trail. <br> <<switch _freezeSlot>> <<case "top">><<run setup.Wardrobe.stealWornInGroup("tshirt", "tshirtState", "isShirtStolen")>>@@.mc-action; Your top is gone.@@ <<case "bottom">><<include "StealBottomOuter">>@@.mc-action; Your bottoms are gone.@@ <<case "panties">><<include "StealPanties">>@@.mc-action; Your panties are gone.@@ <<case "bra">><<include "StealBra">>@@.mc-action; Your bra is gone.@@ <</switch>> <br><br> @@.backbtn;[[Continue|$return]]@@ <<run setup.Ghosts.markActiveProwlEvent()>> <<run setup.HauntedHouses.rearmHuntTimer()>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <</if>>
/* Furniture-search passage for hunts. HuntRun's furniture row routes here via setup.HuntController.setSearchedFurniture(). Multi-item slots: the floor-plan generator prefers distinct furniture slots but can stack multiple loot kinds on one slot when the room runs out of unique furniture. The branch reads the full uncollected list via setup.HuntController.lootKindsAt and renders one beat per kind in a single search -- the player never has to click the same drawer twice. Solo searches keep the existing linkappend reveal flavor; multi-item searches drop the gate and reveal everything at once so the back-button is one click away. */ <<video "mechanics/curseditems/lfci.mp4">> <<set _sf to setup.HuntController.searchedFurniture()>> <<set _kinds to _sf ? setup.HuntController.lootKindsAt(_sf.room, _sf.suffix) : []>> <<if _kinds.length eq 0>> @@.mc-thoughts; You search but find nothing of note.@@<br> <br> @@.backbtn; [[Back|$return]]@@ <<elseif _kinds.length eq 1>> <<set _kind to _kinds[0]>> <<set _toolId to setup.FloorPlan.toolIdFromLootKind(_kind)>> <<if _kind eq "cursedItem">> <<include "PickupCursedItem">> <<elseif _kind eq "rescueClue">> @@.mc-thoughts; You find a clue about one of the missing women.@@<br> <<run setup.HuntController.takeLoot("rescueClue")>> <br> @@.backbtn; [[Back|$return]]@@ <<elseif _kind eq "tarotCards" and setup.HauntedHouses.tarotCardsStage() eq setup.TarotStage.HIDDEN>> <<include "PickupTarotCards">> <<elseif _kind eq "monkeyPaw" and setup.MonkeyPaw.isDiscoverable()>> <<include "PickupMonkeyPaw">> <<elseif _kind eq "clothesStolen" and setup.HauntedHouses.hasClothesStolen()>> <<run setup.HuntController.takeLoot("clothesStolen")>> <<include "FindStolenClothes">> <br> <br> @@.backbtn; [[Back|$return]]@@<br> <<elseif _toolId>> <<include "PickupHuntTool">> <<else>> @@.mc-thoughts; You search but find nothing of note.@@<br> <br> @@.backbtn; [[Back|$return]]@@ <</if>> <<else>> @@.mc-thoughts; You find several things tucked together.@@<br> <br> <<for _k range _kinds>> <<huntLootBeat _k>> <</for>> @@.backbtn; [[Back|$return]]@@ <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* Pickup beat for the tarot deck. The carry-stage flip (setup.HauntedHouses.markTarotCarrying) feeds Bag's tarot link and the TarotCards passage; takeLoot stamps the slot collected so a re-search finds nothing. */ @@.mc-thoughts; You come across a strange@@ <<linkappend "@@.usebtn; deck of cards.@@">><br> <<image "mechanics/cursedpossessions/tarot-cards/tarot.png" "displayCentredImgs">> @@.mc-speech; Hmm... are these... tarot cards? <br> This deck looks so unusual... They say it can predict the future.<br> Maybe I should draw a card to see what fate has in store for me? <br> I think I'll take the tarot cards with me. They might be useful.@@<br> <br> @@.mc-action; You put the tarot cards in your bag@@<br> <<run setup.HauntedHouses.markTarotCarrying()>> <<run setup.HuntController.takeLoot("tarotCards")>> <</linkappend>> <br><br> @@.backbtn; [[Back|$return]]@@
/* Pickup beat for a cursed item turned up by a normal furniture search during a hunt. Rolls the type (dildo / buttplug / beads / huge dildo) via setup.Companion.rollFoundCursedItem, which stamps the isCI<Type> + gotCursedItem flags the witch turn-in flow keys off. A "Use it" linkreplace mirrors the companion-found FindCursedItem passage so the player can fire the immediate-use video without walking back to the home cursed-item events. */ <<run setup.HuntController.takeLoot("cursedItem")>> <<if setup.Witch.hasCursedItemToTurnIn()>> @@.mc-thoughts; You come across another cursed object, but you're already carrying one. Best leave this one for now.@@<br> <br> @@.backbtn; [[Back|$return]]@@ <<else>> <<set _ci to setup.Companion.rollFoundCursedItem()>> @@.mc-thoughts; You feel an unusual warmth from one of the objects, and as you reach in, the heat spreads through your fingers. You realize@@ <<linkappend "@@.usebtn; it's a cursed item.@@">><br> @@.mc-speech; <<= _ci.speech>>@@<br> <<image _ci.img "displayCentredImgs">> <br> @@.mc-speech; The witch will want to see this. Just touching it has me feeling... worked up.@@<br> +30 <<statIcon setup.StatIcon.HEALTH>><br><<addLust 30>> <br> @@.mc-action; You put the cursed item in your bag@@<br> <br> Or perhaps... <<linkreplace "Use it">> <<include "UseCursedItem">> <</linkreplace>><br> <</linkappend>> <br><br> @@.backbtn; [[Back|$return]]@@ <</if>>
/* Pickup beat for the monkey paw. The setup.MonkeyPaw.markFound() flip feeds Bag's monkey-paw link + the MonkeyPaw wish menu. */ @@.mc-thoughts; You come across a strange@@ <<linkappend "@@.usebtn; paw.@@">><br> <<image "mechanics/cursedpossessions/monkey-paw/monkeypaw.jpg" "displayCentredImgs">> @@.mc-speech; Is this... the Monkey Paw? <br> I think I read something about it when I was younger.<br> It grants wishes, but always with tragic consequences. <br> Maybe if I'm careful, I can avoid any trouble? <br> I think I'll take the monkey paw with me. It might be useful.@@<br> <br> @@.mc-action; You put monkey paw in your bag@@<br> <<run setup.MonkeyPaw.markFound()>> <<run setup.HuntController.takeLoot("monkeyPaw")>> <</linkappend>> <br><br> @@.backbtn; [[Back|$return]]@@
/* huntLootBeat -- compact pickup beat for one loot kind, used when a multi-item furniture slot reveals everything in a single search. Each kind renders a one- or two-line "you find X" line (with a small image for the carriable items) and immediately marks the kind collected via the appropriate setup.* call -- no linkappend gating, since the player never has to click the same drawer twice in the multi-item case. The single-item path keeps its existing linkappend reveals (PickupTarotCards / PickupMonkeyPaw / PickupHuntTool) for flavor; this widget only fires when _kinds.length > 1. */ <<widget "huntLootBeat">> <<set _kind to _args[0]>> <<set _toolId to setup.FloorPlan.toolIdFromLootKind(_kind)>> <<if _kind eq "cursedItem">> <<if setup.Witch.hasCursedItemToTurnIn()>> @@.mc-thoughts; Another cursed item, tucked into the furniture -- you're already carrying one, so this one stays.@@<br><br> <<else>> <<set _ci to setup.Companion.rollFoundCursedItem()>> @@.mc-thoughts; A cursed item, tucked into the furniture.@@<br> @@.mc-speech; <<= _ci.speech>>@@<br> <<image _ci.img "iconsOnMap">><br> @@.mc-action; You put it in your bag.@@<br><br> <</if>> <<run setup.HuntController.takeLoot("cursedItem")>> <<elseif _kind eq "rescueClue">> @@.mc-thoughts; A clue about one of the missing women.@@<br><br> <<run setup.HuntController.takeLoot("rescueClue")>> <<elseif _kind eq "tarotCards">> @@.mc-thoughts; A strange deck of tarot cards.@@<br> <<image "mechanics/cursedpossessions/tarot-cards/tarot.png" "iconsOnMap">><br> @@.mc-action; You put the tarot cards in your bag.@@<br><br> <<if setup.HauntedHouses.tarotCardsStage() eq setup.TarotStage.HIDDEN>> <<run setup.HauntedHouses.markTarotCarrying()>> <</if>> <<run setup.HuntController.takeLoot("tarotCards")>> <<elseif _kind eq "monkeyPaw">> @@.mc-thoughts; A withered monkey's paw.@@<br> <<image "mechanics/cursedpossessions/monkey-paw/monkeypaw.jpg" "iconsOnMap">><br> @@.mc-action; You put the paw in your bag.@@<br><br> <<if setup.MonkeyPaw.isDiscoverable()>> <<run setup.MonkeyPaw.markFound()>> <</if>> <<run setup.HuntController.takeLoot("monkeyPaw")>> <<elseif _kind eq "clothesStolen" and setup.HauntedHouses.hasClothesStolen()>> @@.mc-thoughts; Your stolen clothes, balled up out of sight.@@<br> @@.mc-action; You put them back on.@@<br><br> <<if setup.Wardrobe.isPantiesStolen()>><<run setup.Wardrobe.restoreStolenInGroup("panties", "isPantiesStolen")>><</if>> <<if setup.Wardrobe.isBottomStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bottomOuter")>><<run State.variables.isBottomStolen = 0>><<run State.variables.isJeansStolen = 0>><<run State.variables.isShortsStolen = 0>><<run State.variables.isSkirtStolen = 0>><</if>> <<if setup.Wardrobe.isShirtStolen()>><<run setup.Wardrobe.restoreStolenInGroup("tshirt", "isShirtStolen")>><</if>> <<if setup.Wardrobe.isBraStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bra", "isBraStolen")>><</if>> <<run setup.HauntedHouses.clearClothesStolenFlag()>> <<run setup.HuntController.takeLoot("clothesStolen")>> <<elseif _toolId>> <<set _toolDef to setup.searchToolDefs[_toolId]>> @@.mc-thoughts; A piece of hunting equipment -- the <<= setup.HuntController.humanizeLootKind(_kind)>>.@@<br> <<image "ui/img/" + _toolDef.iconFile "iconsOnMap">><br> @@.mc-action; You put it in your bag.@@<br><br> <<run setup.HuntController.takeLoot(_kind)>> <</if>> <</widget>>
/* Pickup beat for a hunting tool found in furniture during a hunt. The Empty Bag modifier and any tools-restricting loadout leave the toolbar starting short; setup.HuntController.startHunt stamps the missing tools onto the floor plan as 'tool_<id>' loot, and takeLoot here marks the slot collected. setup.HuntController.startingTools re-renders the toolbar union of the starting set + collected loot on the next visit to HuntRun, so the picked-up tool becomes clickable in the strip. */ <<set _kind to setup.HuntController.lootAt(setup.HuntController.searchedFurniture().room, setup.HuntController.searchedFurniture().suffix)>> <<set _toolId to setup.FloorPlan.toolIdFromLootKind(_kind)>> <<set _toolDef to setup.searchToolDefs[_toolId]>> @@.mc-thoughts; You come across a piece of hunting@@ <<linkappend "@@.usebtn; equipment.@@">><br> <<image "ui/img/" + _toolDef.iconFile "displayCentredImgs">> @@.mc-speech; Someone left this behind. It looks like it still works -- <br> I should keep it. It might give me an edge in here.@@<br> <br> @@.mc-action; You put the <<= setup.HuntController.humanizeLootKind(_kind)>> in your bag@@<br> <<run setup.HuntController.takeLoot(_kind)>> <</linkappend>> <br><br> @@.backbtn; [[Back|$return]]@@
<<run setup.HauntedHouses.beginProwlEvent()>> <<set _check to random(1,3)>> <<if _check eq 1>> <<video "mechanics/hunting/1.mp4" { controls: false, loop: false }>> <</if>> <<if _check eq 2>> <<video "mechanics/hunting/2.mp4" { controls: false, loop: false }>> <</if>> <<if _check eq 3>> <<video "mechanics/hunting/3.mp4" { controls: false, loop: false }>> <</if>> @@.mc-thoughts; Suddenly, you hear the dull sound of footsteps approaching you. It's starting. The ghost is on the hunt. Time is running out. Looking around, you see shadows closing in on you. It's time to act before it's too late.@@<br> @@.usebtn; [[Run away|RunFast]]@@ or @@.usebtn; [[Try to hide|Hide]]@@ <<if setup.HauntedHouses.succubusEventTimer() gte 1>> or @@.usebtn; [[Summon the succubus|HuntEventSuccubus]]@@<br> <</if>> <<if setup.HauntConditions.canPray()>> or @@.usebtn;<<link `"Pray it passes (−10 sanity, −" + setup.HauntConditions.ENERGY_COST_PRAY + " energy)"` "PrayHunt">> <</link>>@@ <</if>> <<if setup.HauntedHouses.hasAnyGarmentWorn()>> or @@.usebtn;<<link "Freeze and let it pass (lose a garment)" "FreezeHunt">> <</link>>@@ <<else>> or @@.usebtn;<<link "Freeze and let it pass (nothing left to give)" "FreezeHunt">> <</link>>@@ <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <<run State.variables.prowlActivated = 1>>
<div class="flexwrapper"> <<huntHouseCard "owaissa">> <<huntHouseCard "elm">> <<huntHouseCard "ironclad">> </div> <div class="flexwrapper"> <<huntCard>> </div> <<nobr>> <<run setup.Ghosts.fireActiveOnEnterHouse()>> <<run setup.Time.resetToMidnight()>><<run setup.Tick.resetCooldowns()>> <<done>> <<replace "#time">><<= setup.Time.display()>><</replace>> <</done>> <<if setup.Companion.anyCompanionSelected()>><<run setup.Companion.markCompanionFlagActive()>><</if>> <</nobr>>
<<set _check to random(1,2)>> <<if _check eq 1>> <<image "mechanics/hunting/hid1.jpg" { width: "100%" }>><br> <</if>> <<if _check eq 2>> <<image "mechanics/hunting/hid2.jpg" { width: "100%" }>><br> <</if>>   You quickly hide, holding your breath and trying not to make a sound. Your heart is pounding wildly, almost drowning out all other noises. You feel the fear tightening around your throat, but you try to stay calm.<br>   Outside, you hear footsteps, heavy and menacing. The ghost is nearby. Several agonizing seconds, maybe minutes, pass as you struggle with the urge to peek out and check <<linkappend "@@.usebtn; if it has gone away.@@">><br> <<set _checkH to random(1,100)>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.hidingSucceeds eq true>> <<set _checkH to 0>> <<elseif _hg and _hg.hidingSucceeds eq false>> <<set _checkH to 100>> <</if>> <<if _checkH lte 35>>   Finally, you decide to take a look. You carefully lift your head and peek out from your hiding place. The ghost's shadow has vanished, and the room is silent again. It seems @@.usebtn;[[you got lucky|$return]]@@ Now the main thing is to act cautiously and not reveal yourself again. <<else>> <<video "mechanics/hunting/hunt-end.mp4" { controls: false, loop: false }>>    You slowly peek out from your hiding place, hoping the ghost has left. But your eyes meet its hollow sockets. A chill grips your body, and you realize you've made a fatal mistake.<br> You have a little time to <<if setup.HauntedHouses.crucifixAmount() gte 1>> @@.usebtn; [[use the Crucifix|Crucifix]]@@ . Or perhaps, it might be best <<done>> <<if setup.Mc.corruption() lte 4>> <<addclass ".checkForCorruptionHunt" "disabled-link">> <</if>> <</done>> <span class="checkForCorruptionHunt"> @@.usebtn;[[not to resist...|HuntEnd]]@@ <<if setup.Mc.corruption() lte 4>>@@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 5)@@ <</if>></span> <<else>> use the Crucifix, but unfortunately, @@.enterbtn;[[you don't have it...|HuntEnd]]@@ <</if>> <</if>> <</linkappend>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<run setup.MonkeyPaw.ensureGuideInit()>> <div class="MonkeyPawShow"> <<image "mechanics/cursedpossessions/monkey-paw/monkeypaw.jpg" "displayCentredImgs">> <span id="wishesCount"> <<if not setup.MonkeyPaw.hasWishes()>> @@.mc-speech; It seems that I have no more wishes left...@@<br> <<else>> @@.mc-thoughts; <b>Hmm...What should I wish for?</b> <br><<= setup.MonkeyPaw.wishesLeft()>> wishes left...@@<br> <<if setup.MonkeyPaw.guideStage() eq setup.MonkeyPawGuide.NOT_ASKED>> @@.mc-speech; I need to be extremely careful... Maybe I should ask the witch how to use it? I think she could help me.@@ <</if>> <br><br> <<for _w range setup.MonkeyPaw.list()>> <<if setup.MonkeyPaw.isLearned(_w.id)>> <<capture _w>> <<linkreplace `"@@.usebtn; " + _w.label + "@@"`>> <<monkeyPawWish _w.widget>> <</linkreplace>> @@.mc-thoughts; <<= setup.MonkeyPaw.describe(_w.id)>>@@<br> <</capture>> <</if>> <</for>> <<if setup.MonkeyPaw.hasAnything()>> <<linkreplace "@@.usebtn; I wish for anything@@">> <<monkeyPawWish setup.MonkeyPaw.rollAnything().widget>> <</linkreplace>><br> <</if>><br> <<if not setup.MonkeyPaw.hasGuide()>> <label><b>@@.mc-speech;I wish for/to...@@</b><<monkeyPawWishInput>></label> <<link "@@.usebtn; Make a Wish@@">> <<set _inputWish to setup.Gui.monkeyPawWishInput()>> <<set _wish to setup.MonkeyPaw.byInput(_inputWish)>> <<if _wish>> <<run setup.MonkeyPaw.markLearned(_wish.id)>> <<monkeyPawWish _wish.widget>> <<elseif _inputWish.toLowerCase().trim() eq "anything">> <<run setup.MonkeyPaw.grantAnything()>> <<monkeyPawWish setup.MonkeyPaw.rollAnything().widget>> <<else>> <<replace "#falseMonkeyPaw">> @@.mc-speech; Nothing happened...@@ <</replace>> <</if>> <</link>><br> <span id="falseMonkeyPaw"></span> <</if>> <</if>> <br> <br> @@.backbtn; [[Back|$return]]@@ </span></div> <br>
<<set _videoList to []>> <<run setup.Ghosts.markActiveProwlEvent()>> <<if setup.HauntedHouses.nudityNakedNoBottoms()>> <<if setup.Mc.exhibitionism() lte 4>> <<set _videoList to [ {type: "video", src: "outfits/bottoms/naked/1.mp4"}, {type: "image", src: "outfits/bottoms/naked/2.png"}]>> <<else>> <<set _videoList to [ {type: "video", src: "outfits/bottoms/naked/10.mp4"}, {type: "video", src: "outfits/bottoms/naked/11.mp4"}, {type: "video", src: "outfits/bottoms/naked/12.mp4"}, {type: "video", src: "outfits/bottoms/naked/13.mp4"}, {type: "video", src: "outfits/bottoms/naked/14.mp4"}, {type: "video", src: "outfits/bottoms/naked/15.mp4"}]>> <</if>> <<elseif setup.HauntedHouses.nudityToplessWithPanties()>> <<if setup.Mc.exhibitionism() lte 4>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.BRA)>> <<set _videoList to [ {type: "image", src: "outfits/bottoms/naked/5.png"}, {type: "image", src: "outfits/bottoms/naked/6.png"}, {type: "image", src: "outfits/bottoms/naked/7.png"}]>> <<else>> <<set _videoList to [ {type: "image", src: "outfits/bottoms/naked/3.png"}, {type: "image", src: "outfits/bottoms/naked/4.png"}]>> <</if>> <<else>> <<set _videoList to [ {type: "video", src: "outfits/bottoms/naked/30.mp4"}, {type: "video", src: "outfits/bottoms/naked/31.mp4"}, {type: "video", src: "outfits/bottoms/naked/32.mp4"}]>> <</if>> <<elseif setup.HauntedHouses.isTopless()>> <<set _videoList to [ {type: "video", src: "outfits/bottoms/naked/20.mp4"}, {type: "video", src: "outfits/bottoms/naked/21.mp4"}, {type: "video", src: "outfits/bottoms/naked/22.mp4"}]>> <<elseif setup.HauntedHouses.isFullyDressed()>> <<goto "Livingroom">> <</if>> /* When isFullyDressed redirects via <<goto>>, _videoList stays empty. <<goto>> defers navigation to end-of-render, so the rest of the body keeps executing — guard the consumer so we don't read .type off an undefined .random() result and trip <<if>> with a JS exception. */ <<if _videoList.length gt 0>> <<set _selectedVideo to _videoList.random()>> <<if _selectedVideo.type is "video">> <<video _selectedVideo.src>> <<else>> <<image _selectedVideo.src { class: "displayCentredImgs", alt: "Image" }>><br> <</if>> <</if>> <<if setup.Mc.exhibitionism() lte 4>> @@.mc-thoughts; You hurry through the dark streets, trying to stay hidden in the shadows. Your heart races so fast, it feels like it's echoing through the empty night. Every breath catches in your throat as the cool breeze teases your bare skin, making you shiver in embarrassment. @@<br> @@.mc-speech; Why didn't I just go back and grab my clothes? How did I let this happen?@@<br> @@.mc-thoughts; Every time a car passes, your body tenses, and you glance around nervously, praying they didn't see you. The air brushing against your bare skin only heightens the feeling of vulnerability.@@<br> @@.mc-thoughts; You pick up the pace, your steps quickening into a run as you feel the growing urge to get home faster, hoping no one else catches sight of you.@@<br> @@.mc-speech; If someone sees me like this, I'll want to disappear into the ground.@@<br> @@.mc-thoughts; You dart forward, eyes scanning the street for anyone nearby, silently begging that this night will remain your little secret.@@<br> <br> <<if setup.Mc.exhibitionism() lte 9>> <<run setup.Mc.addExhibitionism(1)>> @@.mc-speech; Exhibitionism increased: <<= setup.Mc.exhibitionism()>> now!@@<br> <</if>> <<else>> @@.mc-thoughts; You walk through the night, feeling every caress of the cool air ignite your bare skin. You bite your lip, a soft shiver of pleasure running down your spine. Each step sends a sweet ripple through you, intensifying this strange, yet delicious sensation. You're no longer in a hurry -- in fact, you want to savor the moment.<br> Your fingers toy with your hair, and your hips sway gently with each step. @@<br> @@.mc-speech; I like this @@<br> @@.mc-thoughts; You enjoy every glance from a passerby who catches a glimpse of your naked body. Smiling to yourself, you feel the slow, rising wave of arousal wash over you.@@<br> <br> <<if setup.Mc.exhibitionism() lte 9>> <<run setup.Mc.addExhibitionism(1)>> @@.mc-speech; Exhibitionism increased: <<= setup.Mc.exhibitionism()>> now!@@<br> <</if>> <</if>> <br> @@.backbtn; [[You made it home|Livingroom]] @@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<run setup.Companion.setActiveLust(100)>> <<run setup.Ghosts.markActiveProwlEvent()>> <<set _videoList to []>> <<set _videoList to ["outfits/bottoms/naked/duo1.mp4", "outfits/bottoms/naked/duo2.mp4", "outfits/bottoms/naked/duo3.mp4", "outfits/bottoms/naked/duo4.mp4", "outfits/bottoms/naked/duo5.mp4"]>> <<set _randomIndex to random(0, _videoList.length - 1)>> <<set _selectedVideo to _videoList[_randomIndex]>> <<video _selectedVideo>> @@.mc-thoughts; You're walking home together. A gentle breeze tickles your bodies, and only a bathrobe offers a bit of cover from complete nudity@@<br> @@.notmc-speech; Oh~ <<= setup.Mc.name()>>, this is weird, but I'm actually starting to like it. <br> I'm so turned on, I feel like I could fuck half the city right now@@<br> @@.mc-speech; Hehe~ and you called me a slut... How about you walk me home first?@@<br> @@.notmc-speech; Yeah, sure.@@<br> <br> <<run setup.Wardrobe.loseAllStolen()>> @@.backbtn; [[You're finally home|WalkHomeTogether]]@@<br>
/* Sanity-as-currency + energy gate: spend 10 sanity AND ENERGY_COST_PRAY * energy to short-circuit the hunt without burning a crucifix. The ghost * loses interest; treated like a clean escape (mark the event, reset the * trigger timer, return to the room). The energy spend can also exhaust * the player — if so, route to HuntOverExhaustion instead of the room. */ <<run setup.Mc.removeSanity(10)>> <<run setup.HauntConditions.removeEnergy(setup.HauntConditions.ENERGY_COST_PRAY)>> <<updatemeter 'energy' `setup.Mc.energyPct()`>> <<if setup.Mc.sanity() lt 0>> <<run setup.Mc.setSanity(0)>> <<updatemeter 'sanity' `setup.Mc.sanityPct()`>> <<goto setup.HuntController.huntOverPassage("sanity")>> <<elseif setup.Mc.isExhausted()>> <<goto setup.HuntController.huntOverPassage("exhaustion")>> <</if>> <<image "ui/img/crucifix.webp" { class: "displayCentredImgs", width: "60%" }>> <br>   You squeeze your eyes shut and pour everything you have into a silent prayer. Your thoughts fracture; the air gets heavier; for a moment you can't tell which way is up. Then the footsteps fade, and the cold pressure on your neck lifts. <br><br> @@.backbtn;[[Continue|$return]]@@ <<run setup.Ghosts.markActiveProwlEvent()>> <<run setup.HauntedHouses.rearmHuntTimer()>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<if setup.Wardrobe.worn(setup.WardrobeSlot.JEANS) or setup.Wardrobe.worn(setup.WardrobeSlot.SHORTS) or setup.Wardrobe.worn(setup.WardrobeSlot.SKIRT)>> <<else>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.PANTIES)>> <<video "mechanics/hunting/run.mp4">> <</if>> <</if>>   You decide that your only chance to survive is to run. A surge of adrenaline fills your body, and you dash forward without looking back. Your legs carry you through corridors, dark rooms, and narrow passages.<br>   The ghost's footsteps grow louder and closer, and you realize that every second counts. Your heart pounds wildly in your chest, and your breathing becomes more labored.<br>   Finally, after running some distance, you decide to look back. Your heart skips a beat. Did you manage to <<linkappend "@@.usebtn; escape the pursuit, or is the ghost still close behind?@@">><br> <<set _check to random(1,100)>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.runningSucceeds eq true>> <<set _check to 100>> <<elseif _hg and _hg.runningSucceeds eq false>> <<set _check to 0>> <</if>> <<if _check lte 30>> You decide to look back, and your heart freezes with terror. The ghost is still there, closer than you thought. Cold air surrounds you, and you feel an icy hand reaching for you. You have a little time to <<if setup.HauntedHouses.crucifixAmount() gte 1>> @@.usebtn; [[use the Crucifix|Crucifix]]@@ . Or perhaps, it might be best <<done>> <<if setup.Mc.corruption() lte 4>> <<addclass ".checkForCorruptionHunt" "disabled-link">> <</if>> <</done>> <span class="checkForCorruptionHunt"> @@.usebtn;[[not to resist...|HuntEnd]]@@ <<if setup.Mc.corruption() lte 4>>@@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 5)@@ <</if>></span> <<else>> use the Crucifix, but unfortunately, @@.enterbtn;[[you don't have it...|HuntEnd]]@@ <</if>> <<else>> You decide to look back, and to your relief, you see that the ghost has disappeared. The footsteps are no longer audible, and the shadows have stopped closing in around you. You slow down, trying to catch your breath, and feel the adrenaline slowly leaving your body. You managed to escape, and @@.enterbtn;[[you are safe -- for now.|$return]]@@<br> <br> <</if>> <</linkappend>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<run setup.activateTool("uvl")>> @@.mc-thoughts; While focusing on your device, you suddenly felt a hard push from behind. Before you could understand what happened, the ground came veeeeery close. *Bang*@@<br> @@.mc-speech; Ouch! @@ @@.mc-thoughts;You tried to break the fall with your hands, but you didn't react in time. The impact was too strong, and it knocked you out for a few moments. @@ <<set _stealOptions to setup.HauntedHouses.availableStealTargets()>> /% Only stash + mark when something is actually taken. A previous version fired both unconditionally at the top of the passage, flipping isClothesStolen=1 and planting a phantom clothesStolen pin on the floor plan even when the MC had nothing left to steal. %/ <<if _stealOptions.length gt 0>> <<run setup.HuntController.stashStolenClothes()>> <<run setup.HauntedHouses.markClothesStolen()>> <<set _stealOption to _stealOptions.random()>> <<if _stealOption is "panties">> <<include "StealPanties">> @@.mc-speech; Ugh... My head... Did it just push me to the ground? Wait... Where are my panties? Did it take them? What an asshole.<br><b>Maybe I can find them somewhere in the house.</b>Shit. This place is driving me crazy.@@ <<elseif _stealOption is "bra">> <<include "StealBra">> @@.mc-speech; Ugh... My head... Did it just push me to the ground? Wait... Where is my bra? Did it take it? What an asshole.<br><b>Maybe I can find them somewhere in the house.</b>Shit. This place is driving me crazy.@@ <<elseif _stealOption is "outerwear">> <<run setup.Wardrobe.stealWornInGroup("tshirt", "tshirtState", "isShirtStolen")>> <<include "StealBottomOuter">> @@.mc-speech; Ugh... My head... Wait... Where are my clothes? Did it take them? What the hell?<br><b>Maybe I can find them somewhere in the house.</b>Shit. This place is driving me crazy.@@ <</if>> <</if>> <br> <br> @@.backbtn; [[Continue|$return]]@@<br> <<includeStyle>> <<includeStyle2>> <<addclass "body" "style-steal-clothes">> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<set _vid to setup.HauntedHouses.cursedItemVideo()>> <br> <<if _vid>> <<video _vid "displayCentredImgs">><br> @@.mc-speech; Ah~ I can't... and don't want to... stop <br>@@ @@.mc-thoughts; You play with yourself until you cum @@<br>@@.mc-speech; Ohh, I feel wonderful.@@<br> <</if>> <<addclass "body" "style-video-height">> <br> @@.backbtn; [[Back|previous()]]@@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<set _dest to setup.Events.maybeTurnOffLights()>> <<if _dest>> <<goto _dest>> <</if>>
<<if setup.Events.rollProwlEvent()>> <<goto "EventMC">> <</if>>
<<if setup.HauntedHouses.shouldStartRandomProwl()>> <<goto "GhostHuntEvent">> <</if>>
<<if setup.HauntedHouses.shouldTriggerSteal()>> <<run setup.HauntedHouses.markStealClothesTriggered()>> <<goto "StealClothes">> <</if>>
<<image setup.Wardrobe.stealPantiesImage() "displayCentredImgs">> <<run setup.Wardrobe.stealWornInGroup("panties", "pantiesState", "isPantiesStolen")>>
<<image setup.Wardrobe.stealBottomOuterImage() "displayCentredImgs">> <<run setup.Wardrobe.stealBottomOuter()>> <<run State.variables.isBottomStolen = 1>>
<<video setup.Wardrobe.stealBraVideo() "displayCentredImgs">> <<run setup.Wardrobe.stealWornInGroup("bra", "braState", "isBraStolen")>>
<<run setup.ToolController.consumeCrucifix()>> <<image "ui/img/crucifix.webp" { class: "displayCentredImgs", width: "60%" }>> <br>   The crucifix in your hands starts to glow, and the ghost that was about to grab you disappears in a cloud of smoke. You have used 1 crucifix. Now you have <<= setup.HauntedHouses.crucifixAmount()>> left.<br> <br> @@.backbtn;[[Continue|$return]]@@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<div id="tarotCard"><<image "mechanics/cursedpossessions/tarot-cards/tarot.png" "displayCentredImgs">></div> <div id="tarotCardsEnd" class="tarotCardHidden"><<link "@@.usebtn;Pull a card@@">> <<replace "#tarotCard">> <<if setup.HauntedHouses.drawnCards() lt 10>> <<set _chosen to setup.HauntedHouses.drawAndStampTarotCard()>> <<if _chosen>> <<if _chosen.name eq "fool">> <<set _tempCard to setup.tarotDeck[random(0, 8)]>> <div class="fadeInScale"> <<image _tempCard.image "displayCentredImgs fadeInScale">></div> @@.mc-speech; Oh... something's about to happen... but what...@@ <<done>> <<run $(".fadeInScale").addClass("tarotCardsShow")>> <<addclass ".tarotCardHidden" "disabled-link">> <</done>> <<timed 1s>> <<replace #tarotCard>> <<image _chosen.image "displayCentredImgs fadeInScaleFool">> @@.mc-speech; Um, did it just... change? Is this supposed to be a joke? @@ <</replace>> <<done>> <<run $(".fadeInScaleFool").addClass("tarotCardsShow")>> <<removeclass ".tarotCardHidden" "disabled-link">> <</done>> <</timed>> <<else>> <div class="fadeInScale"> <<image _chosen.image "displayCentredImgs">> </div> @@.mc-speech; Oh... something's about to happen... but what...?@@<br> <<done>> <<run $(".fadeInScale").addClass("tarotCardsShow")>> <<addclass ".tarotCardHidden" "disabled-link">> <</done>> <<timed 2s>> <<done>> <<removeclass ".tarotCardHidden" "disabled-link">> <</done>> <</timed>> <</if>> <<if _chosen.effect>> <<= "<<" + _chosen.effect + ">>">> <</if>> <</if>> <<else>> <<replace "#tarotCardsEnd">> <br> @@.mc-thoughts; There's no cards left @@<br> <<run setup.HauntedHouses.markTarotSpent()>> <</replace>> <</if>> <</replace>> <<run setup.HauntedHouses.incrementDrawnCards()>><</link>></div> <br> <div id="tarotBack" class="tarotCardHidden">@@.backbtn; [[Back|$return]]@@</div> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* Baseline offset added to the room temperature: +8 when the player is in the ghost's room AND evidence says temperature, +5 when in the ghost's room without that evidence, +0 otherwise. Colour is green outside the ghost's room (and for tier 5 -- plain), red in the ghost's room, yellow when the room has no temperature evidence. Ghosts with temperatureGlitchChance set (Raiju) occasionally glitch the reading to a random 0..50 value on tier <= 4 thermometers. */ <<set _inGhostRoom to setup.isGhostHere()>> <<set _hg to setup.Ghosts.active()>> <<set _hasTempEvidence to _hg and _hg.hasEvidence("temperature")>> <<set _tier to setup.ToolController.tierOf("temperature")>> <<if _inGhostRoom and _hasTempEvidence>> <<set _offset to 8>> <<set _color to (_tier eq 5 ? "" : "red")>> <<elseif _inGhostRoom>> <<set _offset to 5>> <<set _color to (_tier eq 5 ? "" : _tier eq 4 ? "red" : "yellow")>> <<else>> <<set _offset to 0>> <<set _color to (_tier eq 5 ? "" : "green")>> <</if>> <<set _glitch to (_hg and _hg.rollTemperatureGlitch())>> <<set _reading to _glitch ? random(0, 50) : (random(13, 16) + setup.Time.temperature() + _offset)>> <span class="toolsTextCentered boldText"><<coloredText _color _reading>></span>
/* huntConditions -- single-row HUD above the tool bar. Renders the live per-step deltas, contributor chips, and the spendable-action buttons (bait the ghost, toggle overcharged tools) on ONE row. Numbers come from setup.HauntConditions.snapshot() so the HUD, the tool-card hovertip, and the actual tool/hunt rolls all read the same source. Renders contents only -- the .hunt-conditions wrapper lives on the HuntRun layout so re-renders via <<replace ".hunt-conditions">> don't double-nest the wrapper class (which compounds its 80% font-size). */ <<widget "huntConditions">> <<set _hc to setup.HauntConditions.snapshot()>> <<set _sanityVal to Math.round(_hc.sanityPerStep * 100) / 100>> <<set _lustVal to Math.round(_hc.lustPerStep * 100) / 100>> <<set _energyVal to Math.round(_hc.energyPerStep * 100) / 100>> <<set _sanity to (_sanityVal gt 0 ? "+" : "") + _sanityVal>> <<set _lust to (_lustVal gt 0 ? "+" : "") + _lustVal>> <<set _energy to (_energyVal gt 0 ? "+" : "") + _energyVal>> <<set _corrShown to Math.round(_hc.corruptionPending * 100) / 100>> <<image "ui/img/sanity.png" { class: "hunt-conditions-icon" }>> _sanity/step · <<image "ui/img/hearth.png" { class: "hunt-conditions-icon" }>> _lust/step · <<image "ui/img/energy.png" { class: "hunt-conditions-icon" }>> _energy/step · <<image "ui/img/corruption.png" { class: "hunt-conditions-icon" }>> <<= _corrShown>>/step · Time <<= _hc.timeLabel>> <<if _hc.toolChanceBonus gt 0 or _hc.toolWindowBonus gt 0 or _hc.prowlChanceBonus gt 0>> · tools +<<= _hc.toolChanceBonus>>% <<if _hc.toolWindowBonus gt 0>> /+<<= _hc.toolWindowBonus>>min <</if>> · prowl +<<= _hc.prowlChanceBonus>>% <</if>> <<for _c range _hc.contributors>> <<capture _c>> · <span @style="'color:' + _c.color + ';font-weight:bold;'" @title="_c.detail">[<<= _c.label>>]</span> <</capture>> <</for>> <<huntActionBar>> <</widget>> /* huntActionBar -- spendable-resource action buttons rendered inline at the end of <<huntConditions>>: bait the ghost (lust spend) and toggle overcharged tools on/off. Each click re-renders <<huntConditions>> as a whole (which contains the action bar), so we only need the one <<replace ".hunt-conditions">> per callback. Renders whenever the shared hunt is active on HuntRun; the canBait predicate self-gates against hunts that have no $hunt. */ <<widget "huntActionBar">> <<if setup.HuntController.isHuntActive()>> <<if setup.HauntConditions.canBait()>> · @@.huntActionLink;<<link `"Bait ghost (+" + setup.HauntConditions.BAIT_INITIAL_LUST + " lust, -" + setup.HauntConditions.ENERGY_COST_BAIT + " energy)"`>> <<run setup.HauntConditions.startBait()>> <<updatemeter 'sanity' `setup.Mc.sanityPct()`>> <<updatemeter 'energy' `setup.Mc.energyPct()`>> <<updatemeter 'mclust' `setup.Mc.lust() / 100`>> <<if setup.HauntConditions.isBaitOrgasmPending()>> <<goto "BaitOrgasm">> <<elseif setup.Mc.isExhausted()>> <<goto "HuntOverExhaustion">> <<else>> <<replace ".hunt-conditions">><<huntConditions>><</replace>> <</if>> <</link>>@@ <<elseif setup.HauntConditions.snapshot().baitActive>> · <span class="hunt-actions-note">Baiting: <<= setup.HauntConditions.snapshot().baitStepsRemain>> left</span> <</if>> <<if setup.HauntConditions.isOverchargedMode()>> · @@.huntActionLink;<<link "Tools: Overcharged (revert)">> <<run setup.HauntConditions.toggleOverchargedTools()>> <<replace ".hunt-conditions">><<huntConditions>><</replace>> <</link>>@@ <<else>> · @@.huntActionLink;<<link "Tools: Standard (overcharge)">> <<run setup.HauntConditions.toggleOverchargedTools()>> <<replace ".hunt-conditions">><<huntConditions>><</replace>> <</link>>@@ <</if>> <</if>> <</widget>> /* randRangeImg -- args: pathPrefix, start, end, ext, cssClass? Renders a random image from a numbered sequence. The file path is setup.ImagePath + '/' + pathPrefix + N + ext, where N is an integer picked uniformly from [start..end]. Replaces the long 1..N <<if>> ladders that the tool check passages used to repeat for every image set. */ <<widget "randRangeImg">> <<set _n to random(_args[1], _args[2])>> <<image _args[0] + _n + _args[3] { class: _args[4] || 'evidenceImgs' }>> <</widget>> /* randRangeVideo -- args: pathPrefix, start, end, ext. Video counterpart of randRangeImg. Each file is rendered in the same autoplay/muted/loop/displayCentredImgs shell that TarotCards used to repeat per-card. */ <<widget "randRangeVideo">> <<set _n to random(_args[1], _args[2])>> <<video _args[0] + _n + _args[3] "displayCentredImgs">> <</widget>> /* notFound -- args: message. Canonical "I didn't find anything" block for tool checks that came up empty. */ <<widget "notFound">> <<set _msg to _args[0]>> <div class="notFound-container"> <div class="mc-thoughts">_msg</div> </div> <</widget>> /* coloredText -- args: color, content. Wraps content in the evidence "bold + stroke" text style, optionally coloured. Pass "" for no colour. */ <<widget "coloredText">> <<set _ctColor to _args[0] || "inherit">> <<set _ctBody to _args[1]>> <span @style="'color: ' + _ctColor + '; font-weight: bold; -webkit-text-stroke: 1px black;'" class="boldText">_ctBody</span> <</widget>>
/* huntCard -- arg-less. Drops a procedural-hunt entry into the GhostStreet flexgrid. Always routes to HuntStart for a fresh haunt -- there is no resume from this entry point; clicking the card while a hunt is already in flight forfeits the previous one (counts as failure, pays the failure ectoplasm payout) before the new one rolls. The forfeit fires on the click rather than on HuntStart entry so save/reload paths landing back on the lobby resume the existing hunt instead of accidentally rotating $nextHuntSeed. */ <<widget "huntCard">> <<set _huntAddr to setup.HuntController.addressFromSeed(setup.HuntController.nextSeed()).formatted>> <div class="housecard"> <<image "ui/img/hunt-house.jpg" "iconPx">> <<if setup.Mc.lvl() gte 4>> @@.icontext;<<link _huntAddr "HuntStart">> <<if setup.HuntController.isActive()>><<run setup.HuntController.endHunt(false)>><</if>> <</link>>@@ <<else>> @@.mc-thoughts; Level 4+ required@@ <</if>> </div> <</widget>> /* huntHouseCard -- arg: static hunt-house id from setup.HuntHouses.list() (e.g. "owaissa"). Drops a GhostStreet card that routes to HuntStart with the house's catalogue id stashed on $pendingHuntHouseId; HuntStart reads + clears it before invoking startHunt, so the hunt lifecycle stays in charge of the run. The data is the catalogue, so adding a new static hunt house is one entry in setup.HuntHouses + a card per house here. */ <<widget "huntHouseCard">> <<set _rsh to setup.HuntHouses and setup.HuntHouses.byId(_args[0])>> <<if _rsh>> <div class="housecard"> <<image _rsh.image "iconPx">> <<if setup.Mc.lvl() lt _rsh.levelGate>> <<set _rshGate to _rsh.levelGate>> @@.mc-thoughts; Level _rshGate+ required@@ <<elseif typeof _rsh.gate eq "function" and not _rsh.gate()>> @@.mc-thoughts; <<= _rsh.gateMessage or "Locked">>@@ <<else>> <<capture _rsh>> @@.icontext;<<link _rsh.label "HuntStart">> <<if setup.HuntController.isActive()>><<run setup.HuntController.endHunt(false)>><</if>> <<set $pendingHuntHouseId to _rsh.id>> <</link>>@@ <</capture>> <</if>> </div> <</if>> <</widget>> /* companionStreetTalk -- arg-less. Pulls the objective pronoun off the active companion catalogue entry and routes to the shared CompanionMain passage. Surfaced inside hunt-street contexts where the companion is waiting at the entrance. */ <<widget "companionStreetTalk">> <<set _ac to setup.Companion.active()>> <<if _ac>> @@.usebtn; <<link `"Talk to " + _ac.pronObj` "CompanionMain">> <</link>> @@<br> <</if>> <</widget>>
/* Per-card effect widgets invoked from TarotCards.tw via the data-driven dispatcher. Each widget owns the post-draw behaviour for one card (video clip, stat deltas, goto) so the draw passage holds only the reveal animation + dispatch -- not a 10-arm if/elseif chain. */ <<widget "tarotPassion">> <<timed 2s>> <<randRangeVideo "mechanics/cursedpossessions/passion" 1 4 ".mp4">> @@.mc-speech; Ah~ I'm getting so wet down there... mmm. @@<br> @@.mc-thoughts; Lust increased: +15 <<statIcon setup.StatIcon.HEALTH>>@@<br> @@.mc-thoughts; Sanity decreased: -15 <<statIcon setup.StatIcon.SANITY>>@@<br> <<addSanity -15>> <<addLust 15>> <<run setTimeout(() => window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }), 50)>> <</timed>> <</widget>> <<widget "tarotPulse">> <<timed 2s>> <<randRangeVideo "mechanics/cursedpossessions/pulse" 1 4 ".mp4">> @@.mc-speech; My... oh~ my little asshole is pulsating so hard... <br> Somehow, I feel much better after that...@@<br> @@.mc-thoughts; Lust decreased: -15 <<statIcon setup.StatIcon.HEALTH>>@@<br> @@.mc-thoughts; Sanity increased: +15 <<statIcon setup.StatIcon.SANITY>>@@<br> <<addSanity 15>> <<addLust -15>> <<run setTimeout(() => window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }), 50)>> <</timed>> <</widget>> <<widget "tarotOblivion">> @@.mc-speech; It's... all going dark... I... can't... hold on... @@<br> @@.enterbtn; <<link "Let go" `setup.HuntController.huntOverPassage("sanity")`>> <</link>>@@ <</widget>> <<widget "tarotKnowledge">> <<timed 2s>> <<run setup.HuntController.consumeKnowledgeEvidence()>> @@.mc-speech; Knowledge? Hmm... interesting, that should be useful, right? @@<br> <</timed>> <</widget>> <<widget "tarotPower">> <<timed 2s>> <<randRangeVideo "mechanics/cursedpossessions/power" 1 3 ".mp4">> <<run setTimeout(() => window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }), 50)>> @@.mc-speech; Wow, I can feel power surging through me! Oh, I'm ready to take on anything! @@<br> @@.mc-thoughts; Energy increased: +5 <<statIcon setup.StatIcon.ENERGY>>@@<br> <<addEnergy 5>> <<addFit 1>> <</timed>> <</widget>> <<widget "tarotWhore">> <<timed 2s>> <<randRangeVideo "mechanics/cursedpossessions/whore" 1 6 ".mp4">> @@.mc-speech; Damn, I can feel this affecting my body... everything's so sensitive, and some parts feel... bigger... @@<br> <<run setTimeout(() => window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }), 50)>> <</timed>> <</widget>> <<widget "tarotDeath">> @@.mc-speech; This can't be a good card. Oh no, I'm scared...I need to hide somewhere!@@<br> @@.enterbtn; <<link "Hide" "GhostHuntEvent">> <</link>>@@ /* Once Death is drawn, Back and "Pull a card" both lead straight to the caught-during-prowl ending — only "Hide" escapes. */ <<replace "#tarotCardsEnd">> <<link "@@.usebtn;Pull a card@@" `setup.HuntController.huntCaughtPassage()`>> <</link>> <</replace>> <<replace "#tarotBack">> @@.backbtn; <<link "Back" `setup.HuntController.huntCaughtPassage()`>> <</link>>@@ <</replace>> <</widget>> <<widget "tarotPossession">> @@.mc-speech; Oh fuck.@@<br> @@.enterbtn; <<link "Give in" `setup.HuntController.possessionPassage()`>> <</link>>@@ <</widget>> <<widget "tarotHighpriestess">> <<timed 2s>> @@.mc-speech; Looks like I'm still alive, and no one's about to attack me. I guess things aren't so bad. @@<br> <<run setup.Ghosts.setHighPriestess(true)>> <</timed>> <</widget>>
<<image "ui/img/alarmclock.png" { width: "60%" }>><br> @@.location; Alarm Clock@@<br> <br> Current time: <<= setup.Time.display()>><br> <<if setup.Home.alarmEnabled()>> Alarm set for <<= (setup.Home.alarmHour() < 10 ? "0" : "") + setup.Home.alarmHour()>>:00.<br> <<else>> Alarm is off. @@.mc-speech; My eyes will open whenever they feel like it.@@<br> <</if>> <br> Set wake-up time:<br> <<for _h range [4, 5, 6, 7, 8, 9, 10, 11, 12]>> <<capture _h>> @@.usebtn;<<link `(_h < 10 ? "0" : "") + _h + ":00"` "AlarmClock">> <<run setup.Home.setAlarm(_h)>> <</link>>@@ <</capture>> <</for>> <br> <br> <<if setup.Home.alarmEnabled()>> @@.usebtn;<<link "Turn alarm off" "AlarmClock">> <<run setup.Home.clearAlarm()>> <</link>>@@<br> <</if>> <br> @@.backbtn;[[Back|Bedroom]]@@<br>
<<image "ui/img/mcbathroom.jpg" { width: "100%" }>><br> @@.location; Bathroom@@<br> <<if setup.CursedItems.isItemCursed("bath")>> @@.usebtn;<<link "Take a bath (30 min)" "CursedBathEvent">><<addTime 30>> <</link>><br>@@ <<else>> @@.usebtn;<<link "Take a bath (30 min)" "Bath">><<addTime 30>> <</link>><br>@@ <</if>> <<if setup.CursedItems.isItemCursed("shower")>> @@.usebtn;<<link "Take a shower (5 min)" "CursedShowerEvent">><<addTime 5>> <</link>><br>@@ <<else>> @@.usebtn;<<link "Take a shower (5 min)" "Shower">><<addTime 5>> <</link>><br>@@ <</if>> @@.enterbtn;[[Look in the mirror|Mirror]]<br>@@ @@.enterbtn;[[Wash your face|WashFace]]<br>@@ <br> @@.backbtn;[[Bedroom]]<br>@@
<<randRangeImg "scenes/bath/" 1 2 ".jpg">><br> <<washClean 5>>
<<randRangeImg "scenes/shower/" 1 2 ".jpg">><br> <<washClean 10>>
<<image "ui/img/bedroom.jpg" { width: "100%" }>><br> @@.location; Bedroom@@<br> <br> <<if setup.Home.succubusChoiceText() eq 1>> <<run setup.Home.clearSuccubusChoiceText()>> @@.mc-thoughts; You wake up, back in your original form@@<br> @@.mc-speech; That was... oh... the main thing is that now I have her protection for 5 days.@@<br> <<elseif setup.Home.succubusChoiceText() eq 2>> <<run setup.Home.clearSuccubusChoiceText()>> @@.mc-speech; That was... oh... the main thing is that now I have her protection for 5 days.@@<br> <</if>> <<if setup.Home.summonText() eq 1>> @@.mc-speech; Oh fuck... apparently I summoned the wrong ghost... next time I need to pay attention to the amulet.@@<br> <<run setup.Home.clearSummonText()>> <</if>> <<if setup.Home.canSummonForExorcism()>> @@.enterbtn; [[Summon the ghost|Summoning]]@@<br> <<elseif setup.Home.exorcismOnCooldown()>> @@.mc-thoughts; Enough for today...@@<br> <</if>> <<if setup.Home.succubusTVText() eq 1>> @@.mc-speech; WHAT the fuck just happened... I hope this ghost doesn't bother me anymore. Maybe I should ask how to get rid of it if it keeps haunting me.@@<br> <<run setup.Home.clearSuccubusTVText()>><br> <</if>> <<if setup.Home.tentaclesAfterSleepText() eq 1>> @@.mc-speech;Oh, that was a weird dream, like something was trying to get into my head... Brrr, horrible.@@<br> <<run setup.Home.clearTentaclesAfterSleepText()>> <<elseif setup.Home.tentaclesAfterSleepText() eq 2>> @@.mc-speech;Thank God it was just a nightmare.@@<br> <<run setup.Home.clearTentaclesAfterSleepText()>> <<elseif setup.Home.tentaclesAfterSleepText() eq 3>> @@.mc-thoughts;You woke up. It was just a dream. But the aftermath lingered - your pussy was soaked through, craving more.@@<br> @@.mc-speech;Phew~ why is this happening? I'm so turned on right now...@@<br> <<run setup.Home.clearTentaclesAfterSleepText()>> <<run setup.Mc.setLust(100)>> <<elseif setup.Home.tentaclesAfterSleepText() eq 4>> @@.mc-speech;That was... oh~ I still feel it. I think I came in my sleep...@@<br> <<run setup.Home.clearTentaclesAfterSleepText()>> <<run setup.Mc.setLust(100)>> <<elseif setup.Home.tentaclesAfterSleepText() eq 5>> @@.mc-speech;That was... oh~ I still feel it. I think I came in my sleep, not just once...@@<br> <<run setup.Home.clearTentaclesAfterSleepText()>> <<run setup.Mc.setLust(100)>> <</if>> <<if setup.Home.returningFromHuntDefeat()>> @@.mc-speech; Am I home? I don't remember how I got back here. My whole body aches and is <<linkappend "covered with something">> <<randRangeImg "characters/mc/" 1 17 ".webp">><br> It seems like I'm starting to remember... I lost the battle, but not the war. Next time, I'll be more careful. <br> I don't feel well, my whole body aches... I need to buy some medicine from the store, as hunting ghosts will be much harder without it. <br> <<if setup.CursedItems.isActive()>> @@.mc-thoughts; Something feels off... as you stir awake, you sense a small, lingering ghostly presence in your home. It's faint, but unmistakable -- like something followed you back.@@<br> <</if>> But for now, I need to go to the [[bathroom|Bathroom]]. <<run setup.Home.applyHuntDefeatWake()>> <</linkappend>>@@ <<elseif setup.Home.returningFromMareEnd()>> @@.mc-thoughts; You wake up and see the@@ <<linkappend "@@.mc-thoughtsLink;aftermath of last night on yourself...@@">><br> <<randRangeImg "characters/mc/" 1 17 ".webp">><br> <<run setup.Mc.clearPenalty()>> @@.mc-speech; Weirdly enough, I feel great, maybe even a bit better than usual, hehe. I suppose I should still head to the [[bathroom|Bathroom]].@@ <</linkappend>> <<else>> <<if setup.Home.justSleptFromBedroom()>> <<run setup.Home.applyMareWake()>> <<run setup.Home.advanceMareStageOnWake()>> <<if not setup.Mc.isPenalized()>> @@.mc-speech; I feel unwell... strange, I need to find out what's happening to me. In this condition, it will be much harder for me to hunt ghosts.@@<br> <</if>> <</if>> @@.enterbtn;[[Wardrobe|Wardrobe]]@@ <br> <<if setup.Wardrobe.hasLostClothing()>> @@.alertbtn;[[Replace lost clothing|ReplaceLostClothing]]@@<br> <</if>> @@.enterbtn;[[Bathroom]]@@<br> @@.enterbtn;[[Alarm clock|AlarmClock]]@@<br> <<if setup.CursedItems.isItemCursed("bed")>> @@.usebtn;<<link "Sleep" "CursedBedEvent">> <</link>>@@<br> <<else>> @@.usebtn;[[Sleep|Sleep]]@@<br> <</if>> @@.usebtn;<<link "Take a nap(1 hour)" "Bedroom">> <<addTime 60>> <<if setup.Mc.energy() lt setup.Mc.energyMax()>> <<run setup.Mc.addEnergy(1)>><</if>> <<if setup.SpecialEvent.spiritEventReady()>> <<goto "GhostSpecialEventNapSpirit">> <<elseif setup.Home.tentaclesNapEventReady()>> <<goto "TentaclesEventNap">> <</if>> <</link>>@@<span><<statIcon setup.StatIcon.ENERGY>></span><br> <<if setup.Home.canUseHolyWaterOnMare()>> <<linkreplace "@@.usebtn; Use holy water@@">><<run setup.Home.useHolyWaterOnMare()>> @@.mc-speech; This should help. Now I can sleep peacefully.@@ <</linkreplace>> <</if>> <br> <br> @@.backbtn;[[Livingroom][setup.Time.addMinutes(1)]]@@<br> <</if>>
<<image "ui/img/mchouse.jpg" { width: "100%" }>> <br> @@.location; My home@@<br> @@.mc-thoughts; Home, sweet home@@<br> <br> <span class="enterbtn">[[Go inside|Livingroom]]</span><br> <<if setup.Home.isBrookePossessed()>>@@.usebtn; [[Go find Brooke|PossessedBrooke]]@@<br> <</if>> <br> <span class="backbtn">[[Leave|CityMap]]</span><br> <<if previous(2) is "Home">><<addTime 3>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 3>> <</if>>
<<image "ui/img/mclivingroom.jpg" { width: "100%" }>><br> @@.location; Livingroom@@<br> <br> <<if setup.Home.tentaclesPCText() eq 1>> @@.mc-speech; These are the creatures from nightmares... they've appeared here too@@<br> <<run setup.Home.clearTentaclesPCText()>> <<elseif setup.Home.tentaclesPCText() eq 2>> @@.mc-speech; They're not so bad after all.@@<br> <<run setup.Home.clearTentaclesPCText()>> <<elseif setup.Home.tentaclesPCText() eq 3>> @@.mc-speech; It's a shame they disappeared... I hope next time I'll be able to keep them.@@<br> <<run setup.Home.clearTentaclesPCText()>> <<elseif setup.Home.tentaclesTVText() eq 1>> @@.mc-speech; How long did I sleep? Doesn't matter, I feel fantastic! Hehe~@@<br> <<run setup.Home.clearTentaclesTVText()>> <</if>> @@.usebtn;<<link "Watch tv (30 min)" "Livingroom">> <<addTime 30>> <<if setup.CursedItems.isItemCursed("tv")>> <<goto "CursedTVEvent">> <<elseif setup.SpecialEvent.spiritEventReady()>> <<goto "GhostSpecialEventTVSpirit">> <<elseif setup.Home.succubusTVEventReady()>> <<goto "SuccubusEventTV">> <<elseif setup.Home.tentaclesTVEventReady()>> <<goto "TentaclesEventTV">> <</if>> <</link>>@@<br> <<if setup.CursedItems.isItemCursed("pc")>> @@.enterbtn;<<link "Use PC" "CursedPCEvent">> <</link>>@@<br> <<else>> @@.enterbtn;[[Use PC]]@@<br> <</if>> @@.enterbtn;<<link "Bedroom" "Bedroom">><<addTime 0.5>> <</link>>@@<br> <<if setup.Time.hours() <= 22 and setup.Time.hours() >= 12>> @@.usebtn;<<link "Skip time till midnight" "Livingroom">><<run setup.Home.skipTimeToMidnight()>>@@ <<replace "#time">><<= setup.Time.display()>><</replace>> <</link>><br> <</if>> <<if setup.Home.succubusCanKnock()>> <<linkreplace "@@.usebtn; Someone is gently knocking on the door@@">> <<run setup.Home.markSuccubusArrived()>> @@.mc-thoughts; You open the door -- no one is there. A light breeze brushes against your face and fades away.@@<br> @@.mc-speech; Hmm... Strange, I could've sworn I heard knocking...@@ <</linkreplace>><br> <</if>> <<if setup.Home.isNightForHunt()>> <<if not setup.Wardrobe.isDressedForStreet()>> @@.mc-thoughts; I can't go outside naked @@ <<elseif setup.Home.isDirty()>> @@.mc-thoughts; I need to go to the bathroom first@@ <<elseif setup.Home.isCorruptEnoughToSkipUnderwear()>>@@.movebtn;[[Ghost hunting|GhostStreet]]@@ <<elseif not setup.Wardrobe.isWearingUnderwear()>>@@.mc-thoughts; I can't go outside without underwear @@ <<else>>@@.movebtn;[[Ghost hunting|GhostStreet]]@@ <</if>> <<else>> @@.mc-thoughts;Not appropriate time for ghost hunting@@ <</if>> <br> <br> <<if not setup.Wardrobe.isDressedForStreet()>> @@.mc-thoughts; I can't go outside naked @@ <<elseif setup.Home.isDirty()>>@@.mc-thoughts; I need to go to the bathroom first@@ <<elseif setup.Home.isCorruptEnoughToSkipUnderwear()>>@@.backbtn;[[Leave|Home]]@@ <<elseif not setup.Wardrobe.isWearingUnderwear()>>@@.mc-thoughts; I can't go outside without underwear @@<<else>>@@.backbtn;[[Leave|Home]]@@ <</if>> /*[[RoomCleanup]]*/ <<if previous() is "GhostSpecialEventWraithStart">> <<addTime 60>> <</if>>
<<set _checkBeauty to random(30,100)>> <<if setup.Ghosts.twinsEventReady() and _checkBeauty gt setup.Mc.beauty()>> <<video "characters/ghosts/specials/twins1.mp4">> @@.mc-thoughts;You're looking in the mirror, admiring your reflection, when suddenly two strangers appear, observing you. They assess every curve of your body @@ <<linkappend "@@.mc-thoughtsLink; through the glass@@">> @@.mc-thoughts; You watch them, captivated by their sudden arrival, but they disappear just as quickly as they appeared.@@<br> @@.mc-speech; It was... strange @@<br><br> @@.backbtn;[[Back|Bathroom]] @@<br> <<run setup.Ghosts.consumeTwinsEvent()>> <</linkappend>> <<elseif setup.Ghosts.twinsEventReady() and _checkBeauty lte setup.Mc.beauty()>> <<video "characters/ghosts/specials/twins.mp4">> @@.mc-thoughts;You're looking in the mirror, admiring your reflection, when suddenly two strangers appear, observing you. They assess every curve of your body @@<<linkappend "@@.mc-thoughtsLink; through the glass@@">> <<video "characters/ghosts/specials/twins2.mp4">> @@.mc-thoughts;But they don't disappear. They're here, in reality. They approach closer, and you feel their breath on your skin. Their hands start to caress you, stripping off your clothes, their fingers lightly touching your nipples, making you shiver with desire.@@<br> @@.mc-speech;Oh... this is so... mmm...@@<br> @@.mc-thoughts;You feel your arousal building, your body responding to every touch with incredible pleasure. You can't resist, [[giving in to their desires|TheTwinsEvent]]@@<br> <</linkappend>> <<else>> <span id="mirrorImage"><<image "ui/img/mc.jpg">></span><br> @@.mc-speech; Looking pretty good. I'm ready to take on the world!@@<br> <b>Beauty: </b> <<= setup.Mc.beauty()>> <br> <<if setup.Mc.makeupApplied() eq 0>> <<if setup.Mc.makeupAmount() gte 1>> @@.usebtn;<<link "Apply regular makeup (1 charge)" "Mirror">><<run setup.Home.applyMakeupTier(1)>> <</link>>@@<br> <<else>>@@.mc-speech;I don't have enough makeup@@<br> <</if>> <<if setup.Mc.makeupAmount() gte 2>> @@.usebtn;<<link "Apply stylish makeup (2 charges)" "Mirror">><<run setup.Home.applyMakeupTier(2)>> <</link>>@@<br> <<else>>@@.mc-speech;I don't have enough makeup@@<br> <</if>> <<if setup.Mc.makeupAmount() gte 3>> <<if setup.Mc.corruption() gte 10>> @@.usebtn;<<link "Apply slutty makeup (3 charges)" "Mirror">><<run setup.Home.applyMakeupTier(3)>> <</link>>@@<br> <<else>>@@.usebtn;<<linkreplace "Apply slutty makeup (3 charges)">>@@.mc-speech; Why should I do this makeup?@@ <</linkreplace>>@@<br> <</if>> <<else>>@@.mc-speech;I don't have enough makeup@@<br> <</if>> <<else>>@@.mc-thoughts; I need to remove my makeup first@@ <</if>> <br> @@.backbtn;[[Back|Bathroom]] @@<br> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
@@.location; Replace lost clothing@@<br> <br> <<if not setup.Wardrobe.hasLostClothing()>> @@.mc-thoughts; Nothing to replace -- my wardrobe is back in order.@@<br> <<else>> @@.mc-thoughts; The ghost made off with these. I can pop down to the mall later, or just order replacements now.@@<br> <br> <div class="flexwrapper backgroundForText"> <<for _varName range setup.Wardrobe.lostClothing()>> <<set _item to setup.Wardrobe.itemByVar(_varName)>> <<if _item and _item.price>> <div class="housecard"> <<image "outfits/wardrobe/" + _item.img "iconPx">><br> <span class="priceAmount"><<= _item.price>>$</span><br> <<if setup.Mc.money() gte _item.price>> <<capture _varName>> @@.buyItemLink;<<link "Replace" "ReplaceLostClothing">> <<run setup.Wardrobe.replaceLostClothing(_varName)>> <</link>>@@<br> <</capture>> <<else>> @@.mc-thoughts; I don't have enough money@@ <</if>> </div> <</if>> <</for>> </div> <br> <</if>> @@.backbtn;[[Back|Bedroom]]@@
<<nobr>> <<image "ui/img/sleeping.jpg" { width: "100%" }>> <br> <br> <<if setup.Home.shouldRouteToTentaclesSleep(previous())>> <<run setup.Home.sleepAdvance(setup.Home.restHours())>> <<goto "TentaclesEventSleep">> <</if>> <<if setup.Home.cameFromHuntDefeat(previous())>> <<run setup.Home.applyHuntDefeatPreSleep()>> <</if>> <<set _sleep to setup.Home.resolveSleepWake(previous())>> @@.backbtn;<<link "Wake up" `_sleep.passage`>> <<run setup.Home.sleepAdvance(_sleep.hours)>> <</link>>@@ <<run setup.Home.applySleepPostWake(_sleep.postWake)>> <<if previous() eq "GhostSpecialEventMareEnd">> <<run setup.Mc.setEnergy(30)>> <</if>> <<if setup.Home.cameraBought()>><<run setup.Home.markSleptWithCameraOn()>><</if>> <</nobr>> <<wipeMakeup 5>>
<<image "mechanics/exorcism/thetwinsend.jpg" "displayCentredImgs">> @@.mc-thoughts; You wake up, feeling the sticky liquid on your face.@@<br> @@.mc-speech; THIS WASN'T A DREAM? FUCK@@<br> <<if setup.Home.summonText() eq 1>> @@.mc-thoughts; It seems I summoned the wrong ghost... next time I'll have to pay attention to the amulet.@@<br> <<run setup.Home.clearSummonText()>> <</if>><br><br> @@.backbtn; [[Bathroom|Bathroom]]@@<br> <<run setup.Home.sleepAdvance(8)>>
<<video "characters/ghosts/specials/twins3.mp4">> @@.mc-thoughts;One of them enters your pussy, and the pleasure is so intense that your eyes roll back. The sensation is overwhelming, causing you to start sucking the other's cock, your moans muffled by his length. @@<br> @@.mc-speech;Mmm... fuck@@ <<linkappend "@@.mc-speechLink; this is too good...@@">> <span id ="twinsEventActive"> <<video "characters/ghosts/specials/twins4.mp4">></span> <<set _videoIndex to 4>> @@.mc-thoughts;They take you together@@ <<link "@@.usebtn; in different positions@@">> <<set _videoIndex to (_videoIndex + 1) % 2 +4>> <<replace "#twinsEventActive">> <<video "characters/ghosts/specials/twins" + _videoIndex+`.mp4`>> <</replace>> <</link>> <<linkappend "@@.mc-thoughtsLink; you're their toy.@@">> <<video "characters/ghosts/specials/twins6.mp4">> @@.mc-thoughts;Their fingers penetrate your pussy, making you shudder with waves of pleasure until they bring you to another orgasm. You feel the fluid gush out of you, squirting from the intensity of the sensations.@@<br> @@.mc-speech;Oh, God... I... I can't...@@<br><br> @@.mc-thoughts;You lie there in the bathroom for some time, thoroughly fucked, but then you gather your thoughts and leave the bathroom.@@<br><br> <<run setup.Ghosts.consumeTwinsEvent()>> @@.backbtn; [[Leave|Bedroom]]@@<br> <</linkappend>> <</linkappend>>
<div class="wrapper"> <div class="itemwrapperWardrobe"> <div> <div id="currentOuterwearTop"> <<link "<<image \"outfits/wardrobe/tshirt0.png\">>" "Wardrobe">><<run setup.Wardrobe.takeOffSlotZero("tshirtState0")>> <</link>> </div> <div id="currentOuterwearBottom"> <<link "<<image \"outfits/wardrobe/jeans0.png\">>" "Wardrobe">><<run setup.Wardrobe.takeOffSlotZero("jeansState0")>> <</link>> </div> </div> <div id="wardrobeBG"> <<image "outfits/wardrobe/bg.png" { width: "100px", height: "300px" }>> </div> <div> <div id="currentUnderwearTop"> <<link "<<image \"outfits/wardrobe/slip1.png\">>" "Wardrobe">><<run setup.Wardrobe.takeOffSlotZero("braState0")>> <</link>> </div> <div id="currentUnderwearBottom"> <<link "<<image \"outfits/wardrobe/short1.png\">>" "Wardrobe">><<run setup.Wardrobe.takeOffSlotZero("pantiesState0")>> <</link>> </div> <div id="currentUnderwearStockings"> <<image "outfits/wardrobe/stocking0.png">> </div> </div> <div id="wardrobeAccessories"> <div id="currentNeck"> <<image "outfits/wardrobe/neck0.png">> </div> </div> <div id="wardrobePiercing"> <div id="currentPiercingEars"> <<image "outfits/wardrobe/ear.png">> </div> <div id="currentPiercingNose"> <<image "outfits/wardrobe/nose.png">> </div> <div id="currentPiercingTongue"> <<image "outfits/wardrobe/tongue.png">> </div> <div id="currentPiercingTits"> <<image "outfits/wardrobe/tits.png">> </div> <div id="currentPiercingPussy"> <<image "outfits/wardrobe/pussy.png">> </div> </div> </div> </div> <br> <div class="availableclothes" id="availableClothes"> </div> <br> <div id="availableOuterwear"></div><br> <div id="availableAccessories"></div><br> <div id="availablePiercing"></div><br> <<run setup.Wardrobe.normalizeOuterRememberTokens()>> <<run setup.Wardrobe.refreshAggregateStates()>> <<set _hh to setup.Wardrobe.harassmentLevel()>> <div id="huntHarassmentReadout" class="huntHarassmentReadout"> Estimated hunt harassment: <<= '<span class="huntHarassment-' + _hh + '">' + _hh + '</span>'>> </div> @@.backbtn;[[Back|Bedroom]]@@
<<for _grp range setup.WARDROBE_GROUPS>> <<for _item range _grp.items>> <<capture _grp, _item>> <<set _state to State.variables[_item.var]>> <<set _linkImg to `<<image "outfits/wardrobe/${_item.img}">>`>> <<if _state eq setup.ClothingState.WORN>> <<replace _grp.replaceTarget>> <<link _linkImg "Wardrobe">> <<run setup.Wardrobe.unequip(_grp, _item)>> <</link>> <</replace>> <</if>> <<if _state eq setup.ClothingState.NOT_WORN>> <<if _item.slot eq 0 and def _grp.bareImage>> <<replace _grp.replaceTarget>> <<image "outfits/wardrobe/" + _grp.bareImage>> <</replace>> <</if>> <<append _grp.appendTarget>> <<link _linkImg "Wardrobe">> <<run setup.Wardrobe.equip(_grp, _item)>> <</link>> <</append>> <</if>> <</capture>> <</for>> <</for>>
<<image "ui/img/washface.jpg" { width: "70%" }>><br> @@.mc-speech; Ah, that feels refreshing@@<br> <<run setup.Home.wipeMakeup()>> <br> @@.backbtn;[[Back|Bathroom]] @@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<video "scenes/cursed-home/bath1.webm">><br> @@.location; Bathroom -- Bath@@<br> <br> @@.mc-thoughts; You sink into the warm bathwater, letting the heat soak into your aching muscles. For a moment, everything is peaceful. Then the water darkens -- not dirty, but black, as if the bottom of the tub has dropped into an abyss.@@<br> @@.mc-speech; What the--@@<br> @@.mc-thoughts; Something wraps around your ankles and yanks. You barely manage a gasp before your head plunges beneath the surface. You thrash, but the grip is iron. The black water swallows you whole -- your bathroom, the tub, the ceiling lights -- all of it fading to nothing.@@<br><br> <<linkreplace "@@.usebtn; ...@@">> <<video "scenes/cursed-home/bath2.webm">><br> @@.mc-thoughts; You open your eyes. There is nothing -- an infinite black void in every direction. You're floating, weightless, naked. The bathwater is gone. There is no up or down. Just darkness and silence.@@<br> @@.mc-speech; Where am I?! Hello?!@@<br><br> @@.mc-thoughts; Tentacles emerge from the void -- slick, thick, and glowing faintly. They coil around your wrists and wrench your arms above your head. More wrap your thighs, spreading your legs wide. You're pinned, suspended in the emptiness like a puppet on strings.@@<br> @@.mc-speech; No-- let go of me! Please!@@<br><br> @@.mc-thoughts; A massive tentacle presses against your entrance, slick with something warm. It pushes inside without hesitation, stretching you open, filling you completely. You scream, but the sound dissolves into the void. Another tentacle forces its way into your mouth, muffling your cries as the creature begins to fuck you from both ends with a merciless, rhythmic pace.@@<br> <<linkappend "@@.usebtn; You can't escape@@">> <<video "scenes/cursed-home/bath3.webm">><br> @@.mc-thoughts; The tentacles pound into you harder, faster, driving you toward a peak you can't resist. Your body betrays you -- your pussy clenches around the tentacle inside you as the first orgasm hits you, hard and uncontrollable.@@<br> @@.mc-speech; MMPH~! Mmhh~!!@@<br><br> @@.mc-thoughts; But it doesn't stop. A second orgasm crashes into the first, then a third. The tentacle buried in your pussy swells and erupts, flooding you with thick, hot cum. You feel it filling you -- too much, far too much. Your belly stretches painfully, distending as the creature pumps load after load into you.@@<br> @@.mc-speech; Ah-- ahh~ it hurts... s-stop... too much...!@@<br><br> @@.mc-thoughts; The creature finally pulls out, and cum gushes from your pussy in a torrent. At the same time, the tentacle withdraws from your mouth and thick ropes of cum pour from your lips, dripping down your chin and chest. The release triggers one last orgasm -- your whole body convulses as you squirt violently, spraying into the dark.@@<br><br> @@.mc-thoughts; The darkness dissolves. You're back in the bathtub, gasping, gripping the porcelain edges. The water is warm and clear. Your body is trembling, your thighs pressed together, an ache deep in your core. The bathroom looks exactly as it did before.@@<br> <<run setup.CursedItems.applyCurseEventEffects()>> <br> @@.mc-speech; Oh god... oh fuck... was that... I can still feel it inside me...@@<br> Sanity decreased. Corruption slightly increased.<br> <br> @@.backbtn;[[Back|Bathroom]]@@ <</linkappend>> <</linkreplace>>
<<video "scenes/cursed-home/bed1.webm">><br> @@.location; Bedroom@@<br> <br> @@.mc-thoughts; You stir awake, groggy and disoriented. Something cool and slick is dripping down your neck. You touch it -- clear, sticky, viscous. It stretches between your fingers like slime.@@<br> @@.mc-speech; What the hell is this...?@@<br> @@.mc-thoughts; You sit up and notice something impossible. There's a hole in your mattress -- not torn, but perfectly round, glowing faintly with an eerie light from beneath. It shouldn't be there. It wasn't there before.@@<br><br> <<linkreplace "@@.usebtn; Peer into the hole@@">> @@.mc-thoughts; You lean over the edge, squinting into the light. Before you can process what you're seeing, hands -- cold, slick, terrifyingly strong -- shoot up from under the bed and clamp around your ankles.@@<br> @@.mc-speech; WHAT-- NO! LET GO!@@<br> @@.mc-thoughts; You scream as you're yanked off the mattress and dragged under the bed frame. The world flips, the light swallows you, and your bedroom vanishes.@@<br><br> <<video "scenes/cursed-home/bed2.webm">><br> @@.mc-thoughts; You're on your back, pinned to something cold and flat. Ghostly tendrils hold your wrists above your head and your legs are splayed wide. You twist your neck frantically, searching for an exit -- a seam, a crack, anything. There's nothing. Just dim, pulsing light and the wet sound of something moving closer.@@<br> @@.mc-speech; Please... somebody help me...@@<br><br> @@.mc-thoughts; A thick tendril presses against your pussy and pushes inside without warning. You gasp, back arching off the surface as it fills you, thrusting deep with slow, deliberate strokes. It's terrifying and overwhelming, but a small, shameful part of you breathes a sigh of relief.@@<br> @@.mc-thoughts; At least it's not my ass...@@<br> <<linkappend "@@.usebtn; It doesn't stop@@">> <<video "scenes/cursed-home/bed3.webm">><br> @@.mc-thoughts; The orgasms come in waves -- one rolling into the next, each more intense, each melting away a little more of your resistance. Your eyes have gone glassy. Drool runs down your chin. You've stopped struggling.@@<br><br> @@.mc-thoughts; A tendril hovers near your lips and you lunge for it, sucking it into your mouth greedily, cheeks hollowing as you drain it like you're starving. It pulses against your tongue and you moan around it, swallowing every drop of the warm, tingling fluid it feeds you.@@<br> @@.mc-speech; Mmh~ more... give me more~@@<br><br> @@.mc-thoughts; You spread your legs wider on your own, inviting them. The tendrils oblige -- every one of them tenses and erupts at once. Thick ropes of ghostly cum coat you from head to toe. It splatters across your face, pools between your breasts, floods your pussy and drips down your thighs. You cum so hard you black out for a second, your whole body convulsing.@@<br><br> @@.mc-thoughts; ...@@<br><br> @@.mc-thoughts; You wake up in your own bed. The sheets are tangled around you. The hole in the mattress is gone -- smooth, unbroken fabric. Your body is clean, dry. But your tongue runs across your lips and you taste it. Faint and electric.@@<br> <<run setup.CursedItems.applyCurseEventEffects()>> <br> @@.mc-speech; Ectoplasm... I know I can still taste it. That wasn't a dream.@@<br> Sanity decreased. Corruption slightly increased.<br> <br> @@.backbtn;[[Back|Bedroom]]@@ <</linkappend>> <</linkreplace>>
<<video "scenes/cursed-home/pc1.webm">><br> @@.location; Livingroom -- PC@@<br> <br> @@.mc-thoughts; You sit down at the computer and reach for the mouse. Mid-click, your body locks up. Every muscle seizes -- your fingers hover over the keyboard, your back rigid in the chair. You can't blink. You can't breathe. But the world keeps going -- the screen saver drifts lazily, dust motes float through the lamplight.@@<br> @@.mc-thoughts; A shimmer forms in the corner of the room. You recognize it immediately -- the old man who used to live here. You've sensed his presence before, a harmless echo too weak to even rattle a window. But something is different this time. He looks... younger. Stronger. His outline is sharper, his features more defined -- less like a fading memory and more like a man with purpose.@@<br> @@.mc-thoughts; You'd breathe a sigh of relief if you could. He's always been far too feeble to interact with the living. Nothing to worry about... right?@@<br><br> @@.mc-thoughts; The ghost drifts closer, studying you with eyes that are clearer than you've ever seen them. He extends one translucent finger and taps you on the top of your head.@@<br> @@.mc-thoughts; You feel it. He feels it. You both freeze -- him from shock, you from something far worse than the paralysis already gripping you. Terror locks you cold.@@<br> @@.mc-thoughts; He can touch me. He can touch me.@@<br><br> <<linkreplace "@@.usebtn; ...@@">> <<video "scenes/cursed-home/pc2.webm">><br> @@.mc-thoughts; The ghost doesn't hesitate. It's as if he's been waiting years for exactly this moment. His spectral hands grip the sides of your face, tilting your frozen head back, and he slides his ghostly cock into your open mouth.@@<br> @@.mc-speech; ...!@@<br><br> @@.mc-thoughts; He fucks your mouth with desperate, eager thrusts -- clumsy but relentless. You can feel every inch of him, cold and tingling against your tongue. Your eyes water but you can't close them, can't gag, can't pull away. He groans -- a sound like wind through old pipes -- and cums, filling your mouth with something thick and electric that pools behind your teeth.@@<br><br> @@.mc-thoughts; He pulls out and spins your chair to face the desk, positioning you like a mannequin. You're left staring at the monitor, mouth full of ectoplasm, unable to swallow, unable to spit.@@<br> @@.mc-thoughts; And beneath the horror, a shameful heat -- you can feel your panties soaked through, your pussy drooling without your permission.@@<br> <<linkappend "@@.usebtn; Minutes pass@@">> <<video "scenes/cursed-home/pc3.webm">><br> @@.mc-thoughts; Minutes crawl by. You sit motionless, ghost cum still pooled in your mouth, staring at the screensaver. Then you feel him again -- that faint shimmer returning, drawn back like an addict to the warmth of living flesh.@@<br><br> @@.mc-thoughts; Gentle hands lift you from the chair. He sits down in your place and carefully lowers you onto his lap, your back against his translucent chest. You feel his cock press against your entrance, then slide inside -- slowly, almost tenderly.@@<br> @@.mc-thoughts; He begins to thrust. It's pathetic, really -- shallow, unsteady pumps with no rhythm or force. The ghost of a frail old man trying his best. It goes on for what feels like an eternity, his hips rocking beneath you with the enthusiasm of someone who hasn't felt warmth in decades.@@<br><br> @@.mc-thoughts; And yet -- somehow -- against all reason -- pressure builds. Slowly. Impossibly slowly. Each weak thrust nudges something deep inside you, and despite everything, your frozen body starts to respond. Heat coils tighter and tighter in your core.@@<br> @@.mc-speech; Mmh... mmhh...@@<br><br> @@.mc-thoughts; The orgasm hits without warning. Your paralysis breaks and you scream, lurching forward off his lap, legs buckling as your body convulses violently. You catch yourself on the desk, knocking the keyboard to the floor, cumming so hard you can't see straight.@@<br> @@.mc-speech; AHHH~ oh FUCK~ oh god oh god oh god--@@<br><br> @@.mc-thoughts; You ride the waves, delirious, moaning openly, your hips grinding against nothing. Then -- a cold, sticky sensation spreading inside you. Ghost cum. Filling your pussy, leaking down your thighs.@@<br> @@.mc-thoughts; You whip around, chest heaving.@@<br> @@.mc-thoughts; The chair is empty. The room is quiet. The screensaver drifts on.@@<br> <<run setup.CursedItems.applyCurseEventEffects()>> <br> @@.mc-speech; He's gone... but I can still feel it dripping out of me. And I still haven't swallowed what's in my mouth...@@<br> Sanity decreased. Corruption slightly increased.<br> <br> @@.backbtn;[[Back|Livingroom]]@@ <</linkappend>> <</linkreplace>>
<<video "scenes/cursed-home/shower1.webm">><br> @@.location; Bathroom -- Shower@@<br> <br> @@.mc-thoughts; You step into the shower and reach for the faucet, but something catches your eye. Sitting on the shelf where your shampoo should be is a dildo -- thick, smooth, and glistening as if it's been waiting for you. You've never seen it before.@@<br> @@.mc-speech; Where did that come from...?@@<br> @@.mc-thoughts; You should be alarmed, but instead your hand reaches for it on its own. The moment your fingers wrap around the shaft, a jolt of heat rushes through your body straight to your core. Your eyes glaze over, lips parting slightly. It feels perfect in your grip -- warm, heavy, pulsing with a low warmth.@@<br><br> <<linkreplace "@@.usebtn; You can't let go@@">> <<video "scenes/cursed-home/shower2.webm">><br> @@.mc-thoughts; The lust hits you like a wave. Your knees buckle and the dildo slips from your fingers, landing back on the shower shelf above you -- tantalizingly close but just out of reach from the floor. You sink down, water cascading over your naked body. It doesn't matter -- your hand slides between your legs on its own.@@<br> @@.mc-speech; Fuck... I need... I need to...@@<br><br> @@.mc-thoughts; You rub your clit frantically, fingers slipping through your folds as the warm water streams down your back. Your first orgasm hits fast -- your thighs clamp together and you cry out, back arching against the tile. But it's not enough. Not even close. A second orgasm follows on its heels, then a third, each one leaving you more desperate than the last.@@<br> @@.mc-speech; Ahh~ ah~ oh god... why can't I stop... I need more~@@<br><br> @@.mc-thoughts; Your eyes drift up to the shelf. The dildo is still there, glistening under the water. It seems bigger now, throbbing gently, and the sight of it makes your pussy clench with desperate hunger. You pull yourself up on shaky legs and grab it.@@<br> <<linkappend "@@.usebtn; You need it inside you@@">> <<video "scenes/cursed-home/shower3.webm">><br> @@.mc-thoughts; You press the dildo against the glass shower door and it sticks -- held by some invisible force. You turn around, line yourself up, and sink onto it with a long, shuddering moan. It fills you completely, stretching you in all the right ways.@@<br> @@.mc-speech; Oh fuck~ oh fuck yes~ it's so deep...@@<br><br> @@.mc-thoughts; You slam your hips back against the door, fucking yourself senseless. The wet slap of your ass against the glass echoes through the bathroom as water runs down your body. Orgasm after orgasm rolls through you -- you lose count, your legs shaking, mascara running, drool on your chin.@@<br><br> @@.mc-thoughts; When you finally pull yourself off, trembling and barely able to stand, you turn and look at the dildo still stuck to the glass. You feel oddly grateful.@@<br> @@.mc-speech; That was... you were incredible...@@<br><br> @@.mc-thoughts; You drop to your knees and take the dildo into your mouth -- slowly, tasting yourself on it. You take it deeper with a satisfied hum, tongue working the shaft. As your lips slide off with a soft pop, the dildo shimmers, flickers, and fades into nothing -- like it was never there at all.@@<br> <<run setup.CursedItems.applyCurseEventEffects()>> <br> @@.mc-speech; It's gone... but I can still feel it. Everywhere.@@<br> Sanity decreased. Corruption slightly increased.<br> <br> @@.backbtn;[[Back|Bathroom]]@@ <</linkappend>> <</linkreplace>>
<<video "scenes/cursed-home/tv1.webm">><br> @@.location; Livingroom@@<br> <br> @@.mc-thoughts; You're flipping through channels when the screen cuts to static. Before you can reach for the remote, the static clears -- and you see yourself. On your own couch. On your knees. Sucking a cock.@@<br> @@.mc-speech; What the fuck?! That's... that's me!@@<br> @@.mc-thoughts; It's you -- unmistakably you, in your own livingroom. The you on-screen looks up at the camera, eyes glazed, working the shaft deeper.@@<br><br> <<linkreplace "@@.usebtn; You can't look away@@">> <<video "scenes/cursed-home/tv2.webm">><br> @@.mc-thoughts; A wave of dizziness hits you. When your vision clears, you're no longer sitting on the couch -- you're kneeling in front of it. Something shimmers in the air before you, a spectral presence taking shape. You can feel it against your lips -- warm, solid, startlingly real.@@<br> @@.mc-speech; How did I-- mmph~@@<br><br> @@.mc-thoughts; Your mouth opens on its own, your tongue sliding along the ghostly shaft as if your body already knows what to do. It's thick and warm despite being translucent, pulsing faintly. Your head bobs forward, taking it deeper, and you moan around it.@@<br> <<linkappend "@@.usebtn; You keep going@@">> <<video "scenes/cursed-home/tv3.webm">><br> @@.mc-thoughts; The spectral presence grips the back of your head, thrusting against your mouth. You gag, eyes watering, but your body refuses to pull away -- the taste of it is intoxicating, electric. Then the ghost tenses and finishes, flooding your mouth with a warm static that dissolves on your greedy tongue.@@<br> @@.mc-speech; Mmh~! Ah... ahh~!@@<br><br> @@.mc-thoughts; The moment you swallow, an orgasm hits you like a freight train. Your thighs clench, your back arches, and you collapse against the couch, trembling and gasping through aftershock after aftershock. When you finally open your eyes, you're sitting on the couch again. The TV plays a normal channel. The room looks exactly as it did before.@@<br> <<run setup.CursedItems.applyCurseEventEffects()>> <br> @@.mc-speech; Was that... did I just... I can still taste it...@@<br> Sanity decreased. Corruption slightly increased.<br> <br> @@.backbtn;[[Back|Livingroom]]@@ <</linkappend>> <</linkreplace>>
<<image "ui/img/documents-working.jpg" { width: "100%" }>> <<if setup.Mc.energy() gte 3>> @@.mc-thoughts; As you sit down to fill out the documents online, you realize just how tedious and time-consuming this task is. The forms are repetitive and the information required seems endless. Hours seem to drag on as you painstakingly input each detail, checking and rechecking your work to ensure accuracy. Two hours later, you finally complete the task, feeling both relieved and exhausted from the monotonous work.@@<br> <b>- 3</b> <<statIcon setup.StatIcon.ENERGY>><br> <<run setup.Companion.setAliceWorkState(2)>> <<run setup.Mc.removeEnergy(3)>> <<addTime 60>> <<addTime 60>> <br> @@.backbtn; [[Finish the work and send the documents to Alice|Use PC]]@@<br> <<else>> @@.mc-speech; I'm too tired@@ @@.warningtext; (Req. 3 <<statIcon setup.StatIcon.ENERGY>>)@@<br> <br> @@.backbtn; [[Back|Use PC]]@@<br> <</if>>
<<if setup.Home.ghostInfoSearchedToday()>> @@.mc-speech; I already searched for information today. I think it's better to try again tomorrow.@@ <<else>> <<linkreplace "Find information about ghosts">> <<run setup.Home.markGhostInfoSearched()>> <<addTime 60>> <<set _available to setup.Ghosts.list().filter(g => g.findableOnline && !g.isInfoCollected)>> <<if _available.length gt 0>> <<if random(1, 100) lte 50>> <<set _entry to _available.random()>>   As you scroll through the information about ghosts, you come across details about @@.mc-speech;the _entry.name!@@<br>   <<= _entry.description>><br>    @@.mc-speech;Information about the _entry.name has been added to the Ghostpedia (ghost icon on the screen).@@ <<run _entry.isInfoCollected = true>> <<else>> @@.mc-thoughts; You search for ghost information online for an hour but find nothing useful.@@<br> @@.mc-speech; That's enough for today. Maybe i'll get lucky and find something tomorrow.@@<br> <</if>> <<else>> @@.mc-thoughts;You scrolled the internet for an hour, but didn't find any new information. It seems like you won't be able to find anything else here.@@ <</if>> <</linkreplace>> <</if>>
<div class="wrapper"> <div class="evidenceFlex"> <<for _g range setup.Ghosts.list()>> <div class="evidenceWrapper"> <div class="evidenceCardIcon"> <<= _g.name>><br> <<image "characters/ghosts/" + _g.image "iconPx">> </div> <div class="evidenceDesc"> <<if _g.isInfoCollected and _g.description neq "">> <<= _g.description>> <<set _hct = _g.prowlConditionText>> <<if _hct neq "">><br>@@.notmc-speech;<<= _hct>>@@ <</if>> <<else>> There is no information yet <</if>> </div> </div> <</for>> </div> </div> <br> <<if previous() eq "Use PC">> @@.backbtn;[[Back|Use PC]]@@<br> <<else>> @@.backbtn;<<back>>@@ <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<image "ui/img/browser-search.png" { width: "100%" }>><br> @@.mc-speech; What should I look for on the internet?@@<br> <br> <<include "FindGhostInfo">> <br> <<linkreplace "@@.usebtn; Find a partner for ghost hunting@@ @@color:red; (trans content)@@">> <b>Someone responded to your offer:</b> <<set _alex to setup.Companion.stateFor("alex")>> <div class="flexwrapper"> <div class="housecard"> <<image "characters/trans/alex.jpg" { width: "100px" }>><br> </div> <div> <b><<= _alex.name>></b>:<br> <em>Chance to find a cursed Item</em>: <<= _alex.chanceOfSuccessCI>>: <br> <em>Chance to find evidence</em>: <<= _alex.chanceOfSuccessAnyEvidence>>: <br> <em>Chance to find the ghost's favorite room</em>: <<= _alex.chanceOfSuccessGR>>: <br> </div> <div style="display:flex; align-items: center;"> <<link "@@.usebtn; Choose Alex@@">> <<run setup.Companion.pickTransCompanion("Alex")>> <<replace "#internetConfirm">> @@.mc-speech; Okay, I think I've found a partner for the next ghost hunt@@ - @@color:red;<b><<= setup.Companion.name()>> </b>@@. @@.mc-speech; He said he would wait for me at the haunted house.@@ <</replace>> <</link>> </div> </div> <<if setup.Home.subscribers() gte 5>> <<set _taylor to setup.Companion.stateFor("taylor")>> <div class="flexwrapper"> <div class="housecard"> <<image "characters/trans/taylor.jpg" { width: "100px" }>><br> </div> <div> <b><<= _taylor.name>></b>:<br> <em>Chance to find a cursed Item</em>: <<= _taylor.chanceOfSuccessCI>>: <br> <em>Chance to find evidence</em>: <<= _taylor.chanceOfSuccessAnyEvidence>>: <br> <em>Chance to find the ghost's favorite room</em>: <<= _taylor.chanceOfSuccessGR>>: <br> </div> <div style="display:flex; align-items: center;"> <<link "@@.usebtn; Choose Taylor@@">> <<run setup.Companion.pickTransCompanion("Taylor")>> <<replace "#internetConfirm">> @@.mc-speech; Okay, I think I've found a partner for the next ghost hunt@@ - @@color:red;<b><<= setup.Companion.name()>> </b>@@. @@.mc-speech; He said he would wait for me at the haunted house.@@ <</replace>> <</link>> </div> </div> <</if>> <<if setup.Home.subscribers() gte 10>> <<set _casey to setup.Companion.stateFor("casey")>> <div class="flexwrapper"> <div class="housecard"> <<image "characters/trans/casey.jpg" { width: "100px" }>><br> </div> <div> <b><<= _casey.name>></b>:<br> <em>Chance to find a cursed Item</em>: <<= _casey.chanceOfSuccessCI>>: <br> <em>Chance to find evidence</em>: <<= _casey.chanceOfSuccessAnyEvidence>>: <br> <em>Chance to find the ghost's favorite room</em>: <<= _casey.chanceOfSuccessGR>>: <br> </div> <div style="display:flex; align-items: center;"> <<link "@@.usebtn; Choose Casey@@">> <<run setup.Companion.pickTransCompanion("Casey")>> <<replace "#internetConfirm">> @@.mc-speech; Okay, I think I've found a partner for the next ghost hunt@@ - @@color:red;<b><<= setup.Companion.name()>> </b>@@. @@.mc-speech; He said he would wait for me at the haunted house.@@ <</replace>> <</link>> </div> </div> <</if>> <span id="internetConfirm"></span> <</linkreplace>> <<if setup.SpecialEvent.mareEventStart() eq 2 or setup.SpecialEvent.mareEventStart() eq 3>> <br><<linkreplace "Feeling unwell after sleep">> @@.mc-thoughts; You find many articles about bad habits, congenital diseases, all stages of cancer, etc. But that's not what you need. After some time, something more interesting appears. Someone suggests that you should check how you sleep. It might be a good idea to buy a video camera and record your sleep.@@<br> @@.mc-speech; This sounds strange, what could be happening to me during sleep? Although, a camera might come in handy in the future. So, I need to go to the store and buy a video camera.@@ <<run setup.SpecialEvent.setMareEventStart(3)>> <<addTime 30>> <</linkreplace>> <<elseif setup.SpecialEvent.mareEventStart() eq 4>> <br><<linkreplace "Someone's whisper during sleep">> @@.mc-thoughts; I found information explaining what's happening. It turns out that this behavior is @@@@.notmc-speech; caused by a Mare.@@ @@.mc-speech;To get rid of it, I just need to sprinkle some holy water in the room.@@ @@.mc-thoughts; It's best to do this as soon as possible, or the ghost will become more persistent with each passing night. However, there's also some information suggesting that I don't have to do anything at all--the ghost might leave on its own.@@ <<run setup.Ghosts.markDiscovered("Mare")>> <</linkreplace>> <<addTime 30>> <</if>> <br> <br> @@.backbtn; [[Back|Use PC]]@@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<set _check to random(1,4)>> <<if _check eq 1>><<image "mechanics/porn/1.webp" { width: "70%" }>> <</if>> <<if _check eq 2>><<image "mechanics/porn/2.webp" { width: "40%" }>> <</if>> <<if _check eq 3>><<image "mechanics/porn/3.webp" { width: "40%" }>> <</if>> <<if _check eq 4>><<image "mechanics/porn/4.webp" { width: "70%" }>> <</if>><br> @@.mc-thoughts; A wave of pleasure ran through you, making your body tremble with delight, taking your mind somewhere far from reality@@<br> <<statIcon setup.StatIcon.HEALTH>> decreased! <br> <<if setup.Mc.corruption() lte 4>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>> <<run setup.Mc.addCorruption(0.2)>><br> <</if>> @@.mc-speech; Fuuhh~, i need to rest a bit@@<br> <<run setup.Mc.setLust(0)>> <br> @@.backbtn;[[Rest and leave|Livingroom]]@@<br> <<addTime 20>>
<<image "ui/img/porn-lab-in.jpg" { width: "100%" }>> @@.location; PornCore@@<br> @@.mc-thoughts; I don't think it's worth explaining what this is for. Here I can relax a little@@<br> <<if setup.Home.masturbationAvailable()>> <<if setup.Home.tentaclesPCEventReady()>> @@.enterbtn;[[Watch porn|TentaclesEventPC]]@@<br> <<else>> @@.enterbtn;[[Watch porn|WatchPorn]]@@<br> <</if>> <<else>> @@.mc-thoughts; Too much for today...@@<br> <</if>> <<if not setup.Home.webcamAccountCreated() and setup.Home.cameraBought()>> @@.enterbtn; <<linkreplace "Click on the ad banner">> @@.mc-thoughts; When you clicked on the link, you landed on a site for webcam shows. The site was flashy and inviting, filled with lots of images and videos. You saw naked women performing explicit shows live. The models were getting tips for their performances. The thought of trying out as a webcam model and making money from it began to swirl around in your mind.@@<br> @@.mc-speech; Why not? I do have a webcam, after all... might as well put it to use. @@<br> @@.mc-thoughts; You created your profile on the site.@@<br> <<run setup.Home.createWebcamAccount()>> <br> @@.mc-action; Now you can do live webcam shows.@@<br> <</linkreplace>>@@<br> <</if>> <br> <br> @@.backbtn;[[Livingroom|Livingroom]]@@
<div class="wrapperPC"> <<image "ui/img/pc.jpg" { id: "bgPC" }>><br> <div class="iconContainer"> <a data-passage="Ghostopedia"><<image "ui/img/ghostopedia.png" " iconPC">><br></a><br> <a data-passage="Evidence"><<image "ui/img/evidence-icon.jpg" " iconPC">><br></a> <a data-passage="PornCore"><<image "ui/img/porn-lab.jpg" "iconPC">></a> <a data-passage="Internet"><<image "ui/img/browser.png" "iconPC">></a> <a data-passage="Contacts"><<image "ui/img/contacts.jpg" "iconPC">></a> <<if setup.Companion.aliceWorkDone()>><a data-passage="DocumentsForAlice"><<image "ui/img/documents.jpg" "iconPC">></a> <</if>> <<if setup.Home.cameraBought() and setup.Home.sleptWithCameraOn()>> <<if setup.SpecialEvent.mareEventStart() gte 2>> <<if setup.Home.mareStageLow()>> <a data-passage="GhostSpecialEventMare" onclick="$.wiki('<<run setup.SpecialEvent.setMareEventStart(4)>>')"><<image "ui/img/webcamera.png" "iconPC">></a> <<else>> <a data-passage="GhostSpecialEvent1Mare" onclick="$.wiki('<<run setup.SpecialEvent.setMareEventStart(4)>>')"><<image "ui/img/webcamera.png" "iconPC">></a> <</if>> <<else>> <a data-passage="GhostSpecialEventMare0"><<image "ui/img/webcamera.png" "iconPC">></a> <</if>> <</if>> <<if setup.Home.webcamAccountCreated()>><a data-passage="WebcamShow"><<image "ui/img/wb.jpg" "iconPC">></a> <</if>> </div> </div> <br> <<if setup.Home.isSuccubusPCEventReady()>> @@.backbtn;[[Back|SuccubusPCEvent]]@@<br> <<else>> @@.backbtn;[[Back|Livingroom]]@@<br> <</if>>
<<run setup.Home.setMasturbationCooldown(1)>> <<set _videoIndex to 0>> <<set _videoPath to setup.Home.PORN_VIDEOS[0]>> <div id="video-container"> <<video _videoPath>> </div> @@.usebtn;<<link "Watch porn">> <<addTime 3>> <<addLust 15>> <<if setup.Mc.lust() gte 60>> <<replace "#watch-pornID">> @@.usebtn;[[Masturbate]]@@ <</replace>> <</if>> <<set _step to setup.Home.nextPornVideo(_videoIndex)>> <<set _videoIndex to _step.index>> <<replace "#video-container">> <<video _step.video>> <</replace>> <</link>>@@ <div id="watch-pornID"></div> <br> @@.backbtn;[[Stop|PornCore]]@@
<<image "scenes/webcam/workplace.jpg" { width: "100%" }>> @@.mc-speech; Looks like I'm ready for my webcam show. What should I do today?@@<br> Subscribers: <<= setup.Home.subscribers()>><br> <<if setup.Home.webcamShowAvailable()>> <<done>> <<if setup.Mc.corruption() lt 2>> <<addclass ".webcamShowMasturbate" "disabled-link">><</if>> <<if setup.Mc.corruption() lt 3>> <<addclass ".webcamShowFingerAnal" "disabled-link">><</if>> <</done>> <span class="webcamShowTease"> @@.usebtn; [[Tease|WebcamShowStart][setup.Home.setWebcamEvent("tease")]]@@<br></span> <span class="webcamShowMasturbate"> @@.usebtn; [[Masturbate|WebcamShowStart][setup.Home.setWebcamEvent("masturbate")]]@@ <<if setup.Mc.corruption() lt 2>>@@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 2)@@ <</if>> <br></span> <span class="webcamShowFingerAnal"> @@.usebtn; [[Anal fingering|WebcamShowStart][setup.Home.setWebcamEvent("fingeranal")]]@@ <<if setup.Mc.corruption() lt 3>>@@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 3)@@ <</if>> <br></span> <<if setup.Home.dildoPurchased()>> <<done>> <<if setup.Mc.corruption() lt 3>> <<addclass ".webcamShowToyPussy" "disabled-link">><</if>> <<if setup.Mc.corruption() lt 4>> <<addclass ".webcamShowToyAnal" "disabled-link">><</if>> <</done>> <span class="webcamShowToyPussy"> @@.usebtn; [[Play with pussy (toy)|WebcamShowStart][setup.Home.setWebcamEvent("toypussy")]]@@ <<if setup.Mc.corruption() lt 3>>@@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 3)@@ <</if>> <br></span> <span class="webcamShowToyAnal"> @@.usebtn; [[Play with ass (toy)|WebcamShowStart][setup.Home.setWebcamEvent("toyanal")]]@@ <<if setup.Mc.corruption() lt 4>>@@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 4)@@ <</if>> <br></span> <</if>> <<else>> @@.mc-speech; Enough for today.@@<br> <</if>> <<run setup.Home.initWebcamCounters()>> <br> @@.backbtn;[[Back|Use PC]] @@<br>
<<set _out to setup.Home.runWebcamShow()>> <<if _out.video>> <<video _out.video "displayCentredImgs">> <</if>> <br> <<webcamEvent>> <span id="showWeBCam"> You earned <<= _out.moneyEarned>> $ and attracted <<= _out.newSubs>> new subscribers.</span> <br> <br> @@.backbtn; [[Back|WebcamShow]]@@<br> <<addclass "body" "style-video-height">>
<<if setup.Home.summoningChoice() eq 1>> <<set _check to random(1,2)>> <<if _check eq 1>> <<image "characters/succubus/ass1.jpg" "displayCentredImgs">> <<elseif _check eq 2>> <<image "characters/succubus/ass2.jpg" "displayCentredImgs">> <</if>> @@.mc-thoughts; The succubus, smirking, speaks an incantation, and the world around you starts to warp. You feel your body changing, becoming more voluptuous, with an enormous, seductive ass.@@<br> @@color:red; Look at you, such a slut, transformed into the perfect fucktoy@@<br> @@.mc-thoughts; Your reflection in the mirror shocks you: you've become the embodiment of sexual fantasies. But before you can even come to terms with it, the succubus, unable to resist, materializes a cock and begins@@ <<linkappend "@@.usebtn; to fuck you@@">> <<if _check eq 1>> <<video "characters/succubus/ass1.1.mp4" "displayCentredImgs">> <<elseif _check eq 2>> <<video "characters/succubus/ass2.1.mp4" "displayCentredImgs">> <</if>> @@color:red; Oh, you like it, don't you? Your body was made for this@@<br> @@.mc-thoughts; Your new form eagerly responding to her dominance.@@<br> @@.mc-thoughts; Her voice dripping with satisfaction as she starts to fuck you harder.@@<br> @@.mc-speech; Yes... oh, yes... more...@@<br> @@.mc-thoughts; The intensity builds, and you feel the overwhelming pleasure cresting. You cum, your body trembling with ecstasy, then everything fades as you pass out@@<br><br> @@.backbtn; [[Pass out|Bedroom][setup.Home.setSuccubusChoiceText(1)]]@@<br> <</linkappend>> <<elseif setup.Home.summoningChoice() eq 2>> <<set _check to random(1,4)>> <<if _check eq 1>> <<image "characters/succubus/form1.0.jpg" "displayCentredImgs">> <<elseif _check eq 2>> <<image "characters/succubus/form2.0.jpg" "displayCentredImgs">> <<elseif _check eq 3>> <<image "characters/succubus/form3.0.jpg" "displayCentredImgs">> <<elseif _check eq 4>> <<image "characters/succubus/2.jpg" "displayCentredImgs">> <</if>> @@.mc-thoughts; You feel the air around you change, as if reality itself is starting to warp. Something inside you takes control, you look at your hands, but they move without your input. Your thoughts merge with another mind, full of lust and cunning. The succubus has possessed you, and now you're under her control.@@<br> @@.mc-thoughts; You feel her desires becoming yours, her hands, your hands, start to explore the body that now belongs to her.@@<br> @@.mc-speech; I'm no longer in control... she's inside me@@<br> @@.mc-thoughts; You feel her start to play with you, using toys, making your body @@ <<linkappend "@@.usebtn; tremble with pleasure.@@">> <<if _check eq 1>> <<video "characters/succubus/form1.1.mp4" "displayCentredImgs">> <<elseif _check eq 2>> <<video "characters/succubus/form2.1.mp4" "displayCentredImgs">> <<elseif _check eq 3>> <<set _checkIn to random(1,2)>> <<if _checkIn eq 1>> <<video "characters/succubus/form3.1.mp4" "displayCentredImgs">> <<elseif _checkIn eq 2>> <<video "characters/succubus/form3.3.mp4" "displayCentredImgs">> <</if>> <<elseif _check eq 4>> <<set _checkIn to random(1,2)>> <<if _checkIn eq 1>> <<video "characters/succubus/2.mp4" "displayCentredImgs">> <<elseif _checkIn eq 2>> <<video "characters/succubus/4.mp4" "displayCentredImgs">> <</if>> <</if>> @@.mc-speech; Oh... fuck me harder... more...@@<br> @@.mc-thoughts; She begins to fuck herself with wild greed, the toys sliding in and out, making you moan with each thrust. You feel the pleasure building, your body @@<<linkappend "@@.usebtn; exploding from the orgasm@@">> <<if _check eq 1>> <<video "characters/succubus/form1.2.mp4" "displayCentredImgs">> <<elseif _check eq 2>> <<video "characters/succubus/form2.2.mp4" "displayCentredImgs">> <<elseif _check eq 3>> <<if _checkIn eq 1>> <<video "characters/succubus/form3.2.mp4" "displayCentredImgs">> <<elseif _checkIn eq 2>> <<video "characters/succubus/form3.4.mp4" "displayCentredImgs">> <</if>> <<elseif _check eq 4>> <<video "characters/succubus/3.mp4" "displayCentredImgs">> <</if>> @@.mc-speech; "I'm... I'm cumming... oh fuck!"@@<br> @@.mc-thoughts; You cum, your body trembling with ecstasy, then everything fades as you pass out.@@<br><br> @@.backbtn; [[Pass out|Bedroom][setup.Home.setSuccubusChoiceText(1)]]@@<br> <</linkappend>> <</linkappend>> <<elseif setup.Home.summoningChoice() eq 3>> <<video "characters/succubus/pc2.mp4" "displayCentredImgs">> @@.mc-thoughts; The succubus leans over you, her tongue starts to caress your pussy@@<br> @@color:red; Damn, you taste so sweet, I could lick you forever.@@<br> @@.mc-speech; Mmm~@@<br> @@color:red; Now I'm going to fuck you so hard you'll forget your name.@@<br> @@.mc-thoughts; She puts on the strapon, her gaze promising a @@ <<linkappend "@@.usebtn; hard fuck@@">> <<set _check to random(1,4)>> <<if _check eq 1>> <<video "characters/succubus/pc4.mp4" "displayCentredImgs">> <<elseif _check eq 2>> <<video "characters/succubus/pc6.mp4" "displayCentredImgs">> <<elseif _check eq 3>> <<video "characters/succubus/pc7.mp4" "displayCentredImgs">> <<elseif _check eq 4>> <<video "characters/succubus/pc8.mp4" "displayCentredImgs">> <</if>> @@color:red; Your pussy takes me so well@@<br> @@.mc-speech; Fuck me harder... yes...@@<br> @@.mc-thoughts; Her kiss fills you with@@ <<linkappend "@@.usebtn; her power@@">> <<video "characters/succubus/pcend1.mp4" "displayCentredImgs">> @@color:red; You were such a good little slut tonight.@@<br> @@.mc-thoughts; You're left alone, but her taste lingers on your lips.@@<br><br> @@.backbtn; [[Pass out|Bedroom][setup.Home.setSuccubusChoiceText(2)]]@@ <</linkappend>> <</linkappend>> <<elseif setup.Home.summoningChoice() eq 4>> <<video "characters/succubus/trans1.mp4" "displayCentredImgs">> @@.mc-thoughts; The succubus leans over you, her tongue starts to caress your pussy@@<br> @@color:red; Damn, you taste so sweet, I could lick you forever.@@<br> @@.mc-speech; Mmm~@@<br> @@color:red; I'm going to fuck you until you scream.@@<br> @@.mc-thoughts; She reveals her cock, her eyes burning with desire for a @@ <<linkappend "@@.usebtn; wild, unstoppable fuck@@">> <<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/succubus/trans2.mp4" "displayCentredImgs">> <<elseif _check eq 2>> <<video "characters/succubus/trans3.mp4" "displayCentredImgs">> <</if>> @@color:red; Your pussy is so hungry for me@@<br> @@.mc-speech; Deeper... don't stop...@@<br> @@.mc-thoughts; Her kiss leaves you with@@ <<linkappend "@@.usebtn; a burst of her energy@@">> <<video "characters/succubus/trans4.mp4" "displayCentredImgs">> @@color:red; That was one hell of a ride, wasn't it?@@<br> @@.mc-thoughts; Now alone, her kiss still echoes through your senses.@@<br><br> @@.backbtn; [[Pass out|Bedroom][setup.Home.setSuccubusChoiceText(2)]]@@ <</linkappend>> <</linkappend>> <</if>> <<if setup.Home.advanceSummoning()>><<run setup.Tick.resetCooldowns()>><</if>>
<<image "characters/succubus/1.jpg" { width: "100%" }>><br> <<run setup.Home.setSuccubusEventCD(1)>> @@.mc-thoughts; You've been watching TV for a while.@@<br> @@.mc-speech; Ah~ so boring.@@<br> <<linkreplace "@@.usebtn; Entertain yourself@@">> <<video "characters/succubus/1.mp4">> @@.mc-thoughts; You start eagerly rubbing your wet pussy, trying to bring yourself to an orgasm. Your fingers slide over your clit, penetrating you, @@ <<linkappend "@@.usebtn; making you moan.@@">> @@.mc-thoughts;You feel your body transforming... you're becoming... something else.@@<br> <<image "characters/succubus/2.jpg" { width: "100%" }>><br> @@color:red; Hah~ I'll help you, baby...@@<br> @@.mc-thoughts; Your body no longer obeys you. You feel completely different, with an anal plug in your ass, but it doesn't bring discomfort, rather the opposite @@ <<linkappend "@@.usebtn; making you feel completely filled@@">> <span id ="succubusEventTV"> <<video "characters/succubus/2.mp4">></span> <<set _videoIndex to 2>> @@.mc-thoughts;You start fucking yourself@@ <<link "@@.usebtn; in all holes@@">> <<set _videoIndex to (_videoIndex + 2) % 3 + 2>> <<replace "#succubusEventTV">> <<video "characters/succubus/" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; ,playing with the plug, then using your hands and other toys, stuffing them into your pussy and ass without stopping@@<br> @@.mc-thoughts; You cum time after time, but you don't even try to stop. Your holes become extremely sensitive, and with each orgasm, you reach the next one faster and faster, your body trembling with pleasure.@@<br> @@.mc-speech;I I can't Ah~@@<br> @@.mc-thoughts; After yet another orgasm, you stop ravaging your body, giving it a rest.@@<br> @@color:red; Well, that's enough for you today.@@<br> <br> @@.backbtn; [[You pass out|Sleep][setup.Home.setSuccubusTVText(1)]]@@<br> <</linkappend>> <</linkappend>> <</linkreplace>>
<<if setup.Home.succubusPCEventStage() is undefined>> <<run setup.Home.setSuccubusPCEventStage(0)>> <</if>> <<video "characters/succubus/pc1.mp4">> @@.mc-thoughts; You're sitting at your computer, engrossed in work, when something suddenly catches your eye in your peripheral vision.@@<br> @@.mc-speech;What the fuck was that? Maybe I'm just seeing things...@@<br><br> <<linkreplace "@@.backbtn; Leave@@">> <<image "characters/succubus/pc1.jpg" { width: "100%" }>><br> @@.mc-thoughts; Suddenly, a girl appears before you, her eyes piercing through you as if she knows all your secrets. She just stares at you, her gaze so intense that@@ <<linkappend "@@.usebtn; you feel the heat rise@@">> <<if setup.Home.succubusEventCD() eq 2>> <br>@@.mc-thoughts; In a moment, she disappears, leaving you with a sense of something unexplored.@@<br> @@.mc-speech; WHAT the fuck just happened... I hope this ghost doesn't bother me anymore. Maybe I should ask how to get rid of it if it keeps haunting me.@@<br><br> @@.backbtn; [[Leave|Livingroom]]@@<br> <<elseif setup.Home.succubusEventCD() eq 0>> <<run setup.Home.setSuccubusEventCD(1)>> <<video "characters/succubus/pc3.mp4">> @@.mc-thoughts; Her hands unexpectedly wrapping around you from behind, turning you to face the desk. She bends you over, making you lean on the table, your ass now exposed for her to see and touch. Her hands glide over your ass, squeezing it, making you shiver with surprise and arousal.@@<br> @@.mc-speech;Oh... what are you doing?@@<br> @@.mc-thoughts; She starts kissing your ass, her lips leaving trails of passion on your skin, her tongue touching your cheeks, making you@@ <<run setup.Mc.setLust(100)>> <<linkappend "@@.usebtn; tremble with pleasure@@">> <<video "characters/succubus/pc2.mp4">> @@.mc-thoughts; Then, she slightly turns you, her mouth finds your pussy, her tongue begins to caress you, exploring every nook, making@@ <<linkappend "@@.usebtn; you moan with delight.@@">> <<if setup.Home.succubusPCEventStage() eq 0>> <<video "characters/succubus/pcend.mp4">> @@.mc-thoughts; But suddenly, you wake up. It was all just a dream, yet the satisfaction from what you experienced lingers, as if your body still holds the echo of those sensations.@@<br> @@.mc-speech;Damn... that was such a real dream...@@<br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>><br><br> @@.backbtn; [[Leave|Livingroom][setup.Home.bumpSuccubusPCEventStage()]]@@ <<else>> <<video "characters/succubus/pc4.mp4">> @@.mc-thoughts; She pulls you to your knees in front of her, guiding a dildo to your mouth, and she starts slowly fucking you with it, making you take it deeper with each thrust. You feel the wetness running down your legs, @@ <<linkappend "@@.usebtn; the arousal reaching its peak@@">> <<if setup.Home.succubusPCEventStage() eq 1>> <<video "characters/succubus/pcend.mp4">> @@.mc-thoughts; But suddenly, you wake up. It was all just a dream, yet the satisfaction from what you experienced lingers, as if your body still holds the echo of those sensations.@@<br> @@.mc-speech;Damn... that was such a real dream...@@<br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>><br><br> @@.backbtn; [[Leave|Livingroom][setup.Home.bumpSuccubusPCEventStage()]]@@<br> <<else>> <span id ="succubusPCEvent"> <<video "characters/succubus/pc5.mp4">></span> <<set _videoIndex to 5>> @@.mc-thoughts; Then, she lifts you back up and starts fucking you with the dildo ,@@ <<link "@@.usebtn; in various positions@@">> <<set _videoIndex to (_videoIndex) % 4 + 5>> <<replace "#succubusPCEvent">> <<video "characters/succubus/pc" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; each movement bringing new sensations, penetrating you with such force and sensuality that you lose yourself. Each thrust brings a new wave of pleasure; you feel an@@ <<linkappend "@@.usebtn; orgasm approaching.@@">> <<if setup.Home.succubusPCEventStage() eq 2>> <<video "characters/succubus/pcend.mp4">> @@.mc-thoughts; But suddenly, you wake up. It was all just a dream, yet the satisfaction from what you experienced lingers, as if your body still holds the echo of those sensations.@@<br> @@.mc-speech;Damn... that was such a real dream...@@<br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>><br><br> @@.backbtn; [[Leave|Livingroom][setup.Home.bumpSuccubusPCEventStage()]]@@<br> <<else>> <<video "characters/succubus/pcend1.mp4">> @@.mc-thoughts; She kisses your lips, smiling, promising even more pleasure. In an instant, she vanishes, leaving you alone with your sensations.<br> You lie there, savoring the orgasm that still ripples through your body, every cell quivering with pleasure. Some time passes, but you don't wake up as before, causing you to wonder@@<br> @@.mc-speech; Is this not a dream? Fuck, I need to get rid of her, or she'll corrupt me completely...@@<br> <<if setup.Mc.corruption() lt 10>> <<run setup.Mc.addCorruption(0.2)>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>><br><br> @@.backbtn; [[Leave|Livingroom]]@@<br> <</if>> <</linkappend>> <</if>> <</linkappend>> <</if>> <</linkappend>> <</linkappend>> <</if>> <</linkappend>> <</linkreplace>>
<<video "mechanics/exorcism/mare1.mp4">> @@.mc-thoughts; Through your sleep, you sense someone.@@ <<linkappend "@@.usebtn; watching you@@">> <span id ="summonMare"> <<video "mechanics/exorcism/mare2.mp4">></span> <<set _videoIndex to 2>> @@.mc-thoughts; You wake up to the exquisite feeling of a tongue gently and insistently @@ <<link "@@.usebtn; lapping at your pussy@@">> <<set _videoIndex to (_videoIndex) % 3 +2>> <<replace "#summonMare">> <<video "mechanics/exorcism/mare" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; sending electric waves of pleasure through your body. You're completely paralyzed, unable to move, but the sensations are so overwhelmingly good that you squirm in place, your moans echoing in the quiet room.@@<br> @@.mc-speech; More... oh, God, more~@@<br> @@.mc-thoughts; Your voice breaking with desire as the tongue masterfully teases you. The sensation is maddening, pushing you@@ <<linkappend "@@.usebtn; closer and closer to the edge@@">> <<video "mechanics/exorcism/mare5.mp4">> @@.mc-thoughts; Your body is rocked by an orgasm, and you pass out, falling back into sleep.@@<br><br> @@.backbtn; [[You pass out|CityMapPossessed][setup.SpecialEvent.setMareEventStart(0)]]@@<br> <</linkappend>> <</linkappend>>
<<video "mechanics/exorcism/spirit1.mp4">> @@.mc-speech; Glp~Ghlp~@@<br> @@.mc-thoughts; He grips your head, forcing you to take his cock deep, fucking your throat, making you swallow him with a groan of pleasure. Spit drips down your chin as he holds your head, controlling each thrust, @@ <<linkappend "@@.usebtn; making you choke with desire.@@">> <span id ="summonSpirit"> <<video "mechanics/exorcism/spirit2.mp4">></span> <<set _videoIndex to 2>> @@.mc-thoughts; Then, without pause, he turns you around, spreads your ass cheeks, and@@ <<link "@@.usebtn; enters your ass forcefully@@">> <<set _videoIndex to (_videoIndex) % 3 +2>> <<replace "#summonSpirit">> <<video "mechanics/exorcism/spirit" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; ,fucking you so that each thrust brings a new wave of pleasure. @@<br> @@.mc-speech; Ah~ My ass~@@<br> @@.mc-thoughts; You moan as he picks up the pace, his cock gliding inside you with such ease, sending shivers through your body. He moves faster, each thrust making@@ <<linkappend "@@.usebtn; you scream with ecstasy@@">> <<video "mechanics/exorcism/spirit5.mp4">> @@.mc-thoughts; He pulls out, turns you around, and comes on your face, covering you with his hot cum, leaving you trembling with pleasure@@<br><br> @@.backbtn; [[Sleep|Sleep][setup.Home.setSummonText(1); setup.SpecialEvent.setSpiritEventStage(1)]]@@ <</linkappend>> <</linkappend>>
<<video "mechanics/exorcism/tentacles1.mp4">> @@.mc-thoughts; You were on the verge of falling asleep when tentacles suddenly appeared from nowhere, instantly wrapping around your body, giving you no time to react. They immediately penetrated your mouth and pussy, fucking you hard. One slid down your throat, making you choke on its size, while the other entered your pussy, making you moan with @@ <<linkappend "@@.usebtn; each thrust.@@">> <<video "mechanics/exorcism/tentacles2.mp4">> @@.mc-thoughts; Then they switch positions, one tentacle enters your pussy, the other your ass, fucking you simultaneously, each movement sending a new wave of pleasure through you.@@<br> @@.mc-speech; Oh God, I summoned them... oh... if they don't stop... I... @@ <<linkappend "@@.usebtn; I'll cum...@@">> <<video "mechanics/exorcism/tentacles3.mp4">> @@.mc-thoughts; Finally, the tentacles come inside you, filling all your holes with cum, stuffing you to the brim, making you shudder from the intensity of the sensations.@@<br><br> @@.backbtn; [[Sleep|Sleep][setup.Home.setSummonText(1)]]@@<br> <</linkappend>> <</linkappend>>
<<image "mechanics/exorcism/thetwins.jpg" "displayCentredImgs">> @@.mc-speech; WHERE AM I?@@<br> @@.mc-thoughts; You see two dark figures. They've pulled out their cocks, already hard with desire, and they approach you.@@<br> @@.mc-speech; Oh~ I guess they're going@@ <<linkappend "@@.usebtn; to fuck me...@@">> <span id ="summonTwins"> <<video "mechanics/exorcism/thetwins1.mp4" { loop: false }>></span> <<set _videoIndex to 1>> @@.mc-thoughts; And it really happens. You don't even try to resist - one enters your pussy, the other your mouth, both sliding in easily as if you were made for them.@@ <<link "@@.usebtn; They fuck you@@">> <<set _videoIndex to (_videoIndex) % 2 +1>> <<replace "#summonTwins">> <<video "mechanics/exorcism/thetwins" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; , one going deeper, making you gasp with his size, the other making @@ <<linkappend "@@.usebtn; you suck him greedily@@">> <<video "mechanics/exorcism/thetwins3.mp4">> @@.mc-thoughts; You feel them picking up the pace, their movements becoming more urgent, until they come on your face, covering you with warm cum.@@<br><br> @@.backbtn; [[Sleep|SleepTwins][setup.Home.setSummonText(1); setup.Ghosts.clearTwinsEvent()]]@@<br> <</linkappend>> <</linkappend>>
<<if setup.SpecialEvent.spiritEventStage() eq 0 or setup.Ghosts.twinsEventActive() or setup.SpecialEvent.mareEventStart() neq 0 or setup.Witch.cursedItemState() eq 1>> <<image "ui/img/amulet1.png" "displayCentredImgs">> <<else>> <<image "ui/img/amulet0.png" "displayCentredImgs">> <</if>> @@.mc-speech; Rain talked about the amulet and how it reacts to the presence of ghosts... <br> <<if setup.Witch.exorcismQuestStage() eq setup.ExorcismQuestStage.SUCCUBUS_SUMMONED>> @@.mc-thoughts; <<= setup.Home.succubusEventTimer()>> days left...@@<br> <</if>> I've got everything set up: the book with the incantation is open before me, the words waiting to be spoken. All I need to do now is to begin the summoning ritual...<br>@@ @@.usebtn; [[Begin the summoning ritual|SummoningStart][setup.Home.setExorcismCooldown(1)]]@@<br> <br> @@.backbtn; [[Leave|Bedroom]]@@
<<if setup.SpecialEvent.spiritEventStage() eq 0>> <<image "mechanics/exorcism/spirit.jpg" { class: "displayCentredImgs", width: "100%" }>><br> @@.mc-thoughts; You start reading the words from the ancient book, your lips slowly forming each sound, each word like a whisper filling the room. You feel the energy growing around you, each syllable resonating in the air,@@ <<linkappend "@@.usebtn; calling something invisible@@">> <<image "mechanics/exorcism/spirit1.jpg" { class: "displayCentredImgs", width: "100%" }>> @@.mc-thoughts; You notice a figure appearing right behind you in the mirror reflection, its eyes filled with@@ @@.enterbtn;[[unnatural lust|SummonSpirit]]@@<br> <</linkappend>> <<elseif setup.Ghosts.twinsEventActive()>> <<image "characters/succubus/succubus.jpg" { class: "displayCentredImgs", width: "100%" }>> @@.mc-thoughts; You start reading the words from the ancient book, your lips slowly forming each sound, each word like a whisper filling the room. You feel the energy growing around you, each syllable resonating in the air,@@ <<linkappend "@@.usebtn; calling something invisible@@">><br> @@.mc-thoughts; But nothing happens@@<br> @@.mc-speech; Did I do something wrong?@@<br> @@.mc-thoughts; Suddenly, you feel a growing sense of weakness and fatigue. Barely reaching your bed, you fall into a deep@@ @@.enterbtn;[[sleep|SummonTwins]]@@ <</linkappend>> <<elseif setup.SpecialEvent.mareEventStart() neq 0>> <<image "characters/succubus/succubus.jpg" { class: "displayCentredImgs", width: "100%" }>> @@.mc-thoughts; You start reading the words from the ancient book, your lips slowly forming each sound, each word like a whisper filling the room. You feel the energy growing around you, each syllable resonating in the air,@@ <<linkappend "@@.usebtn; calling something invisible@@">><br> @@.mc-thoughts; But nothing happens@@<br> @@.mc-speech; Did I do something wrong?@@<br> @@.mc-thoughts; Suddenly, you feel a growing sense of weakness and fatigue. Barely reaching your bed, you fall into a deep@@ @@.enterbtn;[[sleep|SummonMare]]@@ <</linkappend>> <<elseif setup.Witch.cursedItemState() eq 1>> <<image "mechanics/exorcism/tentacles.jpg" { class: "displayCentredImgs", width: "100%" }>> @@.mc-thoughts; You start reading the words from the ancient book, your lips slowly forming each sound, each word like a whisper filling the room. You feel the energy growing around you, each syllable resonating in the air,@@ <<linkappend "@@.usebtn; calling something invisible@@">><br> @@.mc-thoughts; But nothing happens@@<br> @@.mc-speech; Did I do something wrong?@@<br> @@.mc-thoughts; Suddenly, you feel a growing sense of weakness and fatigue. Barely reaching your bed, you fall into a deep@@ @@.enterbtn;[[sleep|SummonTentacles]]@@ <</linkappend>> <<elseif setup.Witch.exorcismQuestStage() eq setup.ExorcismQuestStage.REFERRED>> <<image "characters/succubus/succubus0.jpg" { class: "displayCentredImgs", width: "100%" }>> @@.mc-thoughts; You speak the words of the summoning, and the air around you grows denser. From the darkness, the succubus emerges, her smile dripping with mockery and pleasure.@@<br> @@color:red; Finally, you've reached me, my sweet. Decided to play the hunter, have you?@@<br> @@.mc-thoughts; You begin to read the lines from the book, hoping to banish her, but nothing happens. The succubus just laughs, seeing your futile attempts.@@<br> @@color:red; You naive thing! Do you think you can just banish me like that? You have no idea who you're dealing with, baby.@@<br> @@.mc-speech; What do you think of yourself? I'll get rid of you like all the others!@@<br> @@color:red; Oh, honey, you're so naive. I actually enjoy being here with you, especially when I can play with your pussy. Listen, I have a proposition: let's make a deal. I'll help you with your ghost hunts, or... I'll stay here and, trust me, I'll disrupt your life even more than before. But remember, I'll protect you from ghosts for five days after you summon me - I want to enjoy your slutty pussy and your tight ass. What do you say to that?@@<br> @@.mc-speech; Why should I trust you?@@<br> @@color:red; Because you have no choice, bitch. I can make your life hell or heaven, depending on your choice. And don't forget, I can fuck you whenever I want. So choose, work with me or I'll be your personal nightmare.@@<br> @@.mc-speech; What if I agree?@@<br> @@color:red; Then I can sometimes distract the ghosts from you during your hunts, so you don't get fucked into oblivion.@@<br> @@.mc-speech; And if I don't?@@<br> @@color:red; Then I'll fuck you every night until you beg for my attention. Choose, baby.@@<br><br> <b> <span id="succubusSummoningStartChoiceFirst"> <<linkreplace "@@.usebtn; Agree@@">> <<replace "#succubusSummoningStartChoiceSecond">> <</replace>> <<replace "#summoningOr">> <</replace>> <<run setup.Home.setSuccubusEventTimer(5)>> @@color:red; Great, just think of me when another ghost catches you and wants to fuck you. And now, I'm leaving.@@<br> @@.mc-thoughts; The succubus disappeared.@@<br> @@.mc-speech; I don't know... if this is the right choice...@@<br> @@.mc-thoughts; The succubus will protect me from ghost attacks for 5 days during the ghost hunt. But I need to summon her to renew her "protection"@@<br><br> @@.backbtn; [[Back|Bedroom][setup.Witch.markSuccubusSummoned(); setup.Witch.setSuccubusVisited(2)]]@@<br> <</linkreplace>> </span> <span id="summoningOr">or</span> <span id="succubusSummoningStartChoiceSecond"> <<linkreplace "@@.usebtn; Disagree@@">> <<replace "#succubusSummoningStartChoiceFirst">> <</replace>> <<replace "#summoningOr">> <</replace>> @@color:red; Well, sooner or later, you'll agree... So, we'll play with you for a while longer...@@<br> @@.mc-thoughts; The succubus disappeared.@@<br> @@.mc-speech; I don't know... if this is the right choice...@@<br><br> @@.backbtn; [[Back|Bedroom]]@@<br> <</linkreplace>> </span> </b> <<elseif setup.Witch.exorcismQuestStage() eq setup.ExorcismQuestStage.SUCCUBUS_SUMMONED>> <<image "characters/succubus/succubus0.jpg" { class: "displayCentredImgs", width: "100%" }>><br> @@.mc-thoughts; You utter the spell, and the air around you begins to pulse. Out of nowhere, the succubus appears, her eyes gleaming with pleasure.@@<br> @@color:red; What a good little slut you are, calling me again. Well, let's do something fun. Here's your choice: <br>@@ @@.usebtn; [[Change your body temporarily|SuccubusChoice][setup.Home.setSummoningChoice(1)]]@@<br> @@.usebtn; [[Possess you|SuccubusChoice][setup.Home.setSummoningChoice(2)]]@@<br> @@.usebtn; [[Strapon fuck|SuccubusChoice][setup.Home.setSummoningChoice(3)]]@@<br> @@.usebtn; [[Something unusual? (Trans content)|SuccubusChoice][setup.Home.setSummoningChoice(4)]]@@<br> <</if>>
<<run setup.Home.resetTentaclesCooldown()>> <<video "mechanics/tentacles/nap1.mp4">> @@.mc-thoughts; You're about to lie down for a rest when you notice something crawling towards you across the floor. It's the tentacles you've already had the pleasure of meeting. You freeze in place, your body numb with fear and anticipation, your heart beating in time with their movements.@@<br> <<if setup.Home.tentaclesStageAll() gte 1>> <span id="tentaclesEventNapHidOpt">@@.usebtn; [[Run away|Livingroom]]@@ or </span><<linkreplace "@@.usebtn; Stay@@">> <<replace "#tentaclesEventNapHidOpt">> <</replace>> <<video "mechanics/tentacles/nap2.mp4">> @@.mc-thoughts; They quickly take advantage of your hesitation, wrapping around your arms, pinning you down, and some of them are already penetrating your pussy, making you gasp@@ <<linkappend "@@.usebtn; from the sudden invasion@@">> <span id ="tentaclesEventNap"> <<video "mechanics/tentacles/nap3.mp4">></span> <<set _videoIndex to 3>> @@.mc-thoughts; The tentacles try to delve deeper, each one eager to claim you entirely, jostling against each other, creating a chaotic yet incredibly arousing pleasure. Their slick, strong bodies fight for space within you, each movement sending spasms of delight through your body, as if they're trying to tear you apart with pleasure.<br>@@ <<link "@@.usebtn; One tentacle slides up to your face@@">> <<set _videoIndex to (_videoIndex + 1) % 3 + 3>> <<replace "#tentaclesEventNap">> <<video "mechanics/tentacles/nap" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; , and unable to resist, you let it enter your mouth. You start to suck it, tasting its essence, feeling its texture, your tongue wrapping around it, inviting it deeper, and every motion in your mouth echoes through your pussy, creating a closed loop of ecstasy. You feel your body pulsating in rhythm with their movements, each tentacle seeming like an extension of yourself@@ <<linkappend "@@.usebtn; driving you to the brink.@@">> <<video "mechanics/tentacles/nap6.mp4">> @@.mc-thoughts;All this leads to an explosive, simultaneous orgasm - you and the tentacles reach the peak of pleasure together. You feel your muscles clench, while the tentacles, trembling, start to release their semen on you, covering you with warm, sticky fluid. The sensation of being coated in their seed, mixed with your own orgasm, creates a moment that feels endless in its intensity and pleasure. @@ @@.mc-speech; Oh~ fuck, I'm so fucked I can't even stand up.@@<br><br> @@.backbtn; [[Rest|Bedroom][setup.Home.restForHours(4)]]@@ <<if setup.Home.tentaclesStageAll() lt 2>> <<run setup.Home.setTentaclesStageAll(2)>> <</if>> <</linkappend>> <</linkappend>> <</linkreplace>> <<else>> @@.usebtn; [[Run away|Livingroom][setup.Home.setTentaclesPCText(1)]]@@ <</if>>
<<run setup.Home.resetTentaclesCooldown()>> <<video "mechanics/tentacles/pc1.mp4">> @@.mc-thoughts; You're masturbating, caressing your wet pussy. Suddenly, a tentacle crawls across the screen, slowly approaching you like a snake.@@<br> @@.mc-speech; Fuck, what the hell is this?!@@<br><br> <<if setup.Home.tentaclesStageAll() gte 3>> <span id="tentaclesPCHideOpt">@@.usebtn; [[Run away|Livingroom]]@@ or </span><<linkreplace "@@.usebtn; Stay@@">> <<replace "#tentaclesPCHideOpt">> <</replace>> <span id ="tentaclesEventPc"> <<video "mechanics/tentacles/pc3.mp4">></span> <<set _videoIndex to 1>> @@.mc-thoughts; The tentacle doesn't scare you anymore. It ignites a craving for something new, forbidden. You touch it with your tongue - it's slick, tasty, and that makes your pussy start to pulse.@@<br> @@.mc-thoughts; Another one appears from behind, and you take them into , @@ <<link "@@.usebtn; your mouth one by one@@">> <<set _videoIndex to (_videoIndex + 1) % 2 + 2>> <<replace "#tentaclesEventPc">> <<video "mechanics/tentacles/pc" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; licking them as if you're sucking the juiciest cock, feeling your cunt start to@@ <<linkappend "@@.usebtn; drip with anticipation@@">> <<video "mechanics/tentacles/pc4.mp4">> @@.mc-thoughts; They cum on you, covering you with thick, warm semen@@<br> <<if setup.Home.tentaclesStageAll() gte 4>> @@.enterbtn; [[Take them|TentaclesEventPC1]]@@ or @@.enterbtn; [[Leave|Livingroom][setup.Home.setTentaclesPCText(2) ;setup.Mc.setLust(100)]]@@ <<else>> <<if setup.Home.tentaclesStageAll() lt 4>> <<run setup.Home.setTentaclesStageAll(4)>> <</if>> @@.enterbtn; [[Leave|Livingroom][setup.Home.setTentaclesPCText(3); setup.Mc.setLust(100)]]@@ <</if>> <</linkappend>> <</linkreplace>> <<else>> @@.backbtn; [[Run away|Livingroom][setup.Home.setTentaclesPCText(1)]]@@<br> <</if>>
<<video "mechanics/tentacles/pc5.mp4">> @@.mc-thoughts; They cum on you, but it's not enough. You take them in your hands and guide them to your hungry, pulsing pussy.@@<br> @@.mc-speech; Come on, boys, I want you to fuck me so bad@@<br> @@.mc-thoughts; But instead, they penetrate your anus, filling you, stretching you@@<br> @@.mc-speech; Ah~ nooo not there~ Ahh@@<br> @@.mc-thoughts;Fearing to scare them off, you let them @@ <<linkappend "@@.usebtn; explore your asshole.@@">> <<video "mechanics/tentacles/pc6.mp4">> @@.mc-thoughts; More tentacles appear, greedily attacking your asshole,each trying to go deeper, getting in each other's way, creating a chaos of pleasure.You feel each thrust making your body shake, your pussy clench, complaining about the lack of attention@@ <br> @@.mc-speech; Oh I I~ can't~ I'm@@ <<linkappend "@@.usebtn; c-cumming@@">> <<video "mechanics/tentacles/pc7.mp4">> @@.mc-thoughts; You cum from this wild ass fucking. An orgasm rises from deep within you, tearing you apart. As you try to catch your breath, each tentacle starts to cum on you, covering you with sticky, hot semen before disappearing@@<br> @@.mc-speech; Ohhh how nice. Maybe they're not so bad after all...@@<br><br> @@.backbtn; [[Rest|Bedroom][setup.Home.restForHours(3)]]@@<br> <</linkappend>> <</linkappend>>
<<run setup.Home.resetTentaclesCooldown()>> <<video "mechanics/tentacles/sleep1.mp4">> @@.mc-thoughts;Through your sleep, you feel something's off, like something is close to you.@@<br> <<linkappend "@@.usebtn; Wake up@@">> <<if setup.Home.tentaclesStageSleep() eq 0>> <<run setup.Home.setTentaclesStageSleep(1)>> <<run setup.Home.setTentaclesAfterSleepText(1)>> <<goto "Bedroom">> <<else>> <<image "mechanics/tentacles/sleep2.jpg" { width: "100%" }>><br> @@.mc-thoughts;You wake up in a gloomy room, nothing around but darkness.@@<br> @@.mc-speech;What the fuck? Where am I?@@<br> @@.mc-thoughts;You notice several tentacles crawling towards you.@@<br> @@.mc-speech;Oh no~@@<br> <<linkreplace "@@.usebtn; They slowly creep towards you@@">> <<if setup.Home.tentaclesStageSleep() eq 1>> <<run setup.Home.setTentaclesStageSleep(2)>> <<run setup.Home.setTentaclesAfterSleepText(2)>> <<goto "Bedroom">> <<else>> <span id ="tentaclesEventSleep"> <<video "mechanics/tentacles/sleep3.mp4">></span> <<set _videoIndex to 3>> @@.mc-thoughts;Wrapping around your arms and legs, one tentacle freely penetrated your hot, wet pussy and started to fuck you hard.@@<br> @@.mc-speech;Oh, fuck~ what's happening~ Ah@@<br> @@.mc-thoughts;Another tentacle appeared,@@ <<link "@@.usebtn; teasing your sensitive clit@@">> <<set _videoIndex to (_videoIndex) % 2 +3>> <<replace "#tentaclesEventSleep">> <<video "mechanics/tentacles/sleep" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; , making your body shiver with pleasure.@@<br> @@.mc-speech;Oh not two at once@@<br> @@.mc-thoughts;Time felt endless as they seemed to toy with you, speeding up and slowing down, denying you your orgasm.@@<br> @@.mc-thoughts;You felt the tentacle inside your pussy tense up, then it started to cum, flooding you with warm, white fluid, @@ <<linkappend "@@.usebtn; pushing you over the edge.@@">> <<video "mechanics/tentacles/sleep5.mp4">> @@.mc-speech;Aahhh ~fuck@@ <<linkappend "@@.usebtn; I'm c-cumming@@">> <<if setup.Home.tentaclesStageSleep() eq 2>> <<run setup.Home.setTentaclesStageSleep(3)>> <<run setup.Home.setTentaclesAfterSleepText(3)>> <<goto "Bedroom">> <<else>> <<goto "TentaclesEventSleep1">> <</if>> <</linkappend>> <</linkappend>> <</if>> <</linkreplace>> <</if>> <</linkappend>>
<<video "mechanics/tentacles/sleep6.mp4">> @@.mc-thoughts;But the tentacles didn't retreat; they turned you over and started @@ <<linkappend "@@.usebtn; fucking you again@@">> <<video "mechanics/tentacles/sleep7.mp4">> @@.mc-thoughts;Without noticing the tentacle in front of your face, it invaded your mouth while you moaned from your pussy being pounded.@@<br> @@.mc-speech;Mgrm~ Mmm~@@<br> @@.mc-thoughts;One tentacle inside your pussy, another in your mouth. They violate your body simultaneously, making you feel orgasm building up, you're@@ <<linkappend "@@.usebtn; about to cum...@@">> <<video "mechanics/tentacles/sleep8.mp4">> @@.mc-thoughts;They cum inside you, drenching your flesh with their thick, warm semen.@@ <<linkreplace "@@.usebtn; Try to stand up@@">> <<if setup.Home.tentaclesStageSleep() eq 3>> <<run setup.Home.setTentaclesStageSleep(4)>> <<run setup.Home.setTentaclesAfterSleepText(4)>> <<goto "Bedroom">> <<else>> <<video "mechanics/tentacles/sleep9.mp4">> @@.mc-thoughts;Instantly, small tentacles penetrate your ears, paralyzing you,@@ <<linkappend "@@.usebtn; turning you into their puppet.@@">> <<video "mechanics/tentacles/sleep10.mp4">> @@.mc-thoughts;What follows is just blurred memories: you start to satisfy them, taking them into your mouth, guiding them into your craving pussy, seeking deep penetration.@@<br> @@.mc-thoughts;Your breasts become their toys: tentacles suck on your nipples, sending@@ <<linkappend "@@.usebtn; waves of pleasure through you.@@">> <<video "mechanics/tentacles/sleep11.mp4">> @@.mc-thoughts;They reach orgasm together, covering you with semen, filling your pussy, leaving marks all over your skin, everywhere.@@<br> <<if setup.Home.tentaclesStageAll() eq 0>> <<run setup.Home.setTentaclesStageAll(1)>> <</if>> @@.enterbtn; [[Wake up|Bedroom][setup.Home.setTentaclesStageSleep(5); setup.Home.setTentaclesAfterSleepText(5)]]@@<br> <</linkappend>> <</linkappend>> <</if>> <</linkreplace>> <</linkappend>> <</linkappend>>
<<run setup.Home.resetTentaclesCooldown()>> <<image "mechanics/tentacles/tv1.jpg" { width: "100%" }>><br> @@.mc-thoughts; You're sitting in front of the TV, trying to kill time@@<br><br> <span id="tentaclesEventTVHidOpt">@@.usebtn; [[Leave|Livingroom]]@@ or </span><<linkreplace "@@.usebtn; Masturbate@@">> <<replace "#tentaclesEventTVHidOpt">> <</replace>> <<video "mechanics/tentacles/tv2.mp4">> @@.mc-thoughts; You start rubbing your pussy with your hand, sinking into sensual pleasure, each arousing touch making you@@<br> <<linkappend "@@.usebtn; moan with delight.@@">> <<image "mechanics/tentacles/tv3.jpg" { width: "100%" }>><br> @@.mc-thoughts;Suddenly, as if by magic, tentacles appear on you, slick and flexible, as if they've been waiting for this moment.@@<br> <<if setup.Home.tentaclesStageAll() gte 2>> @@.usebtn; [[Let them fuck you|TentaclesEventTV1]]@@ or @@.usebtn; [[Run away|Livingroom]]@@ <<else>> @@.usebtn; [[Run away|Livingroom][setup.Home.setTentaclesPCText(1)]]@@<br> <</if>> <</linkappend>> <</linkreplace>>
<span id ="tentaclesEventTV1"> <<video "mechanics/tentacles/tv4.mp4">></span> <<set _videoIndex to 4>> @@.mc-speech; Oh, you're just in time@@<br> @@.mc-thoughts; The tentacles begin to fuck you. One slides into your pussy, stretching you, filling every nook of your flesh, while another @@ <<link "@@.usebtn; finds its way into your mouth@@">> <<set _videoIndex to (_videoIndex + 1) % 2 + 4>> <<replace "#tentaclesEventTV1">> <<video "mechanics/tentacles/tv" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-thoughts; , making you moan and suck it deeper. They fuck you with an intensity that makes you forget everything but this moment of pure, animalistic pleasure. Each movement, each penetration makes your body tremble with ecstasy.@@<br> @@.mc-thoughts;You can't hold back your moans as they pick up the pace, as if feeling your desire. The tentacles move in a rhythm that seems perfectly tuned to your body,@@ <<linkappend "@@.usebtn; bringing you to the edge@@">> <<video "mechanics/tentacles/tv6.mp4">> @@.mc-thoughts; They cum on you, covering you with warm, sticky semen, and at that moment, you also reach your orgasm, feeling waves of pleasure wash over you, mingling with their seed. You cum together with them, your body shaking from the bright, repeating flashes of pleasure, as if you're dissolving into this moment, completely surrendering to it.@@<br><br> <<if setup.Home.tentaclesStageAll() lt 3>> <<run setup.Home.setTentaclesStageAll(3)>> <</if>> @@.backbtn; [[Rest|Livingroom][setup.Home.setTentaclesTVText(1); setup.Home.restForHours(4)]]@@ <</linkappend>>
<<widget "wipeMakeup">> <<run setup.Home.wipeMakeupWithPenalty(_args[0])>> <</widget>> <<widget "washClean">> <<run setup.Mc.setDirty(0)>> <<wipeMakeup _args[0]>> @@.mc-speech; Nice and clean again@@<br> <br> @@.backbtn;[[Back|Bathroom]]@@ <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <</widget>>
<<run setup.Ghosts.markActiveProwlEvent()>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.canTentacles>> <<set _check to random(0,3)>> @@.mc-thoughts; For a moment, you black out. When you come to, a strange, unsettling feeling lingers -- like someone is close by. Suddenly, movements appear from the shadows, and you notice tentacles. They slowly coil around you, sliding across your skin. You try to resist, but their touches grow more insistent, keeping you captive.@@ <<video "mechanics/tentacles/1." + _check + ".mp4">> @@.mc-thoughts; With each penetration, your breathing grows more uneven, waves of arousal washing over you. You let out an involuntary moan as your body begins to respond to their caresses, the tension inside you building with every second. The excitement intensifies into a pulsing desire that becomes@@ <<linkappend "@@.usebtn; harder and harder to resist.@@">> <<video "mechanics/tentacles/2." + _check + ".mp4">> The tentacles penetrate you more deeply, their movements growing bolder. You give in to them, feeling the white fluid they release flowing <<linkappend "@@.usebtn; out of you.@@">> <<video "mechanics/tentacles/3." + _check + ".mp4">> The sensations drive you wild -- hot waves of pleasure surge through your body, making you lose control. A bright, almost unbearable wave of ecstasy ignites within you, and soon your consciousness fades, <<huntEndExit "plunging you into darkness">> <</linkappend>> <</linkappend>> <<elseif setup.HauntedHouses.isIronclad()>> <<set _randomHuntEven to random(1,4)>> <<video "scenes/prison/hunt" + _randomHuntEven + ".0.mp4">> They caught you and dragged you into a dark room. There's no strength to resist. You feel yourself losing control as the ghosts begin to do whatever they want with you. You can't fight back -- all that's left is to <<linkappend "@@.usebtn; submit@@">> <<video "scenes/prison/hunt" + _randomHuntEven + ".1.mp4">> They keep fucking your holes until they cum all over your body. After a wild fuck, everything around you slowly disappears and you @@.usebtn;[[black out|Sleep]]@@<br> <</linkappend>> <<else>>    It grabbed you, and you felt its icy fingers tighten around your body. In the next moment, you were lifted onto its shoulders, the cold seeping into your bones. You tried to struggle, but your strength was quickly fading.<br>   The ghost dragged you through the dark hallways of the house, and time seemed to slow down. Images blurred before your eyes, sounds became distorted and distant. Your head hung limply, and you felt your consciousness slipping away. Your thoughts grew muddled, and reality seemed distant and unclear.<br> <<if setup.Companion.isCompanionFlagActive() and setup.Companion.name() eq "Alice">> <<video "characters/alice/hunt-end1.mp4">> The last thing you remember is you and your friend sitting on the floor in front of the ghost, choking on his cock one after the other.<br> It's unclear how long <<linkreplace "@@.usebtn; this went on@@">> <<video "characters/alice/hunt-end2.mp4">> Darkness overwhelms your senses as your vision fades, and then... <<huntEndExit "nothing">> <br> <</linkreplace>> <<else>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.JEANS)>> <<video "mechanics/hunting/1.1.mp4">> Ghost put you on the bed and started fucking your huge tits. After a while, having played enough with them, <<linkappend "@@.usebtn; it fucked you@@">> <<set _jeansFinale to ["mechanics/hunting/jeans1.1.mp4", "mechanics/hunting/jeans1.mp4"]>> <<randomVideoFromList _jeansFinale>>    Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <<elseif setup.Wardrobe.worn(setup.WardrobeSlot.SHORTS)>> <<video "mechanics/hunting/shorts1.mp4">> The ghost has caught you, and <<linkappend "@@.usebtn; is dragging you away@@">> <<set _check to random(1,4)>> <<video "mechanics/hunting/shorts1." + _check + ".mp4">>    The ghost started fucking you. Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <<elseif setup.Wardrobe.worn(setup.WardrobeSlot.SKIRT)>> <<set _check to random(1,3)>> <<if _check eq 1>> <<video "mechanics/hunting/skirt1.mp4">> The ghost has caught you, and <<linkappend "@@.usebtn; is dragging you away@@">> <<set _checkScene to random(1,4)>> <<video "mechanics/hunting/skirt1." + _checkScene + ".mp4">>    The ghost started fucking you. Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <<elseif _check eq 2>> <<video "mechanics/hunting/skirt2.mp4">> It put you on your knees and started fucking your throat. But the ghost didn't stop there, <<linkappend "@@.usebtn; it needed more@@">> <<video "mechanics/hunting/skirt2.1.mp4">>    The ghost started fucking you. Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <<elseif _check eq 3>> <<video "mechanics/hunting/skirt3.mp4">> It wasn't even just one ghost, but you didn't care. They fucked you and you liked it. <<linkappend "@@.usebtn; This continued for some time@@">> <<video "mechanics/hunting/skirt4.mp4">>   Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <</if>> <<else>> <<if setup.Wardrobe.worn(setup.WardrobeSlot.PANTIES)>> <<set _check to random(1,2)>> <<if _check eq 1>> <<video "mechanics/hunting/underwear1.mp4">>   It put you on your knees and started fucking your throat. But the ghost didn't stop there, <<linkappend "@@.usebtn; it needed more@@">> <<set _checkScene to random(1,2)>> <<video "mechanics/hunting/underwear1." + _checkScene + ".mp4">>    The ghost started fucking you. Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <<elseif _check eq 2>> <<video "mechanics/hunting/underwear2.mp4">>   It put you on your knees and started fucking your throat. But the ghost didn't stop there, <<linkappend "@@.usebtn; it needed more@@">> <<set _checkScene to random(1,4)>> <<video "mechanics/hunting/underwear2." + _checkScene + ".mp4">>    The ghost started fucking you. Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <</if>> <<elseif not setup.Wardrobe.worn(setup.WardrobeSlot.PANTIES)>> <<set _check to random(1,3)>> <<if _check eq 1>> <<video "mechanics/hunting/naked1.mp4">> The ghost started fucking your ass. It seemed like <<linkappend "@@.usebtn; it would never end@@">> <<video "mechanics/hunting/naked1.1.mp4">>    Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <<elseif _check eq 2>> <<video "mechanics/hunting/naked2.1.mp4">> It started fucking your throat. But the ghost didn't stop there, <<linkappend "@@.usebtn; it needed more@@">> <<video "mechanics/hunting/naked2.2.mp4">>    The ghost started fucking you. Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <<elseif _check eq 3>> <<set _nakedFinale to ["mechanics/hunting/naked3.1.mp4", "mechanics/hunting/naked3.2.mp4", "mechanics/hunting/naked4.1.mp4", "mechanics/hunting/naked4.mp4"]>> <<randomVideoFromList _nakedFinale>> It wasn't even just one ghost, but you didn't care. They fucked you and you liked it. At the end they started cumming on your pretty face, <<linkappend "@@.usebtn; covering it with their cum@@">> <<video "mechanics/hunting/naked4-end.mp4">> Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</linkappend>> <</if>> <<else>>    Your mind was hazy, but your body responded to its movements. You became a puppet in unyielding embrace. Time lost all meaning. Each touch sent shivers of pleasure throughout your body. Finally, having had its fill of playing with you, the ghost left, leaving you exhausted. <br>   Slipping into a deep sleep, you felt the remnants of pleasure <<huntEndExit "fading into darkness">><br> <</if>> <</if>> <</if>> <</if>> /*tentacle*/ <<if not setup.Ghosts.hasHighPriestess()>> <<run setup.HuntController.onCaughtCleanup()>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <</if>>
<<set _check to random(1,6)>> <<if _check eq 1>> <<image "characters/succubus/hunt2.0.jpg" "displayCentredImgs">> @@.mc-thoughts; The ghost moves in on you, but out of nowhere, a surge of sensual magic cuts through the air. The succubus materializes, her very presence snagging the ghost's attention. Her figure exudes an aura of sexuality, with each contour and curve appearing as if designed@@ <<linkappend "@@.usebtn; specifically for temptation.@@">> <<set _checkIn to random(1,4)>> <<if _checkIn eq 1>> <<video "characters/succubus/hunt2.1.mp4">> <<elseif _checkIn eq 2>> <<video "characters/succubus/hunt2.2.mp4">> <<elseif _checkIn eq 3>> <<video "characters/succubus/hunt2.3.mp4">> <<elseif _checkIn eq 4>> <<video "characters/succubus/hunt2.4.mp4">> <</if>> @@.mc-thoughts; She slowly kneels before the ghost, her lips gently enveloping his cock@@<br> @@color:red; Let's see how long you can last@@<br> @@.mc-thoughts; Her tongue caresses him, movements slow and mocking, as if she's playing with him, not letting him@@ <<linkappend "@@.usebtn; cum quickly.@@">> <<video "characters/succubus/hunt2.5.mp4">> @@.mc-thoughts; The ghost can't hold back, his cock erupts with cum that pours into her mouth and onto her face, making her even more seductive. They vanish, leaving you in silence.@@<br><br> @@.backbtn; [[Continue|$return]]@@ <</linkappend>> <</linkappend>> <<elseif _check eq 2>> <<image "characters/succubus/hunt1.0.jpg" "displayCentredImgs">> @@.mc-thoughts; The ghost moves in on you, but out of nowhere, a surge of sensual magic cuts through the air. The succubus materializes, her very presence snagging the ghost's attention. Her figure exudes an aura of sexuality, with each contour and curve appearing as if designed@@ <<linkappend "@@.usebtn; specifically for temptation.@@">> <<video "characters/succubus/hunt1.1.mp4">> @@.mc-thoughts; The succubus mounts the ghost with her huge ass, starting to fuck him@@<br> @@color:red; Oh, fuck~ I've missed this so much...@@<br> @@.mc-thoughts; Her movements are rhythmic and sensual, her moans filling the entire space.@@<br> @@.mc-speech; It's time to get out of here.@@<br><br> @@.backbtn; [[Continue|$return]]@@<br> <</linkappend>> <<elseif _check eq 3>> <<image "characters/succubus/form3.0.jpg" "displayCentredImgs">> @@.mc-thoughts; The ghost moves in on you, but out of nowhere, a surge of sensual magic cuts through the air. The succubus materializes, her very presence snagging the ghost's attention. Her figure exudes an aura of sexuality, with each contour and curve appearing as if designed@@ <<linkappend "@@.usebtn; specifically for temptation.@@">> <<video "characters/succubus/hunt5.1.mp4">> @@.mc-thoughts; The succubus smiles, beckoning the ghost closer, and he doesn't hesitate@@<br> @@color:red; Fuck me how you want, I'll be your little whore now@@<br> @@.mc-thoughts; The ghost enters her with a brutal force, each thrust filled with fury, she moans, yet her smile shows@@ <<linkappend "@@.usebtn; she's enjoying it.@@">> <<video "characters/succubus/hunt5.2.mp4">> @@.mc-thoughts; The ghost can't hold back, he cums inside her, his cum dripping from her thoroughly fucked ass.@@<br><br> @@.backbtn; [[Continue|$return]]@@<br> <</linkappend>> <</linkappend>> <<elseif _check eq 4>> <<image "characters/succubus/hunt6.0.jpg" "displayCentredImgs">> @@.mc-thoughts; The ghost moves in on you, but out of nowhere, a surge of sensual magic cuts through the air. The succubus materializes, her very presence snagging the ghost's attention. Her figure exudes an aura of sexuality, with each contour and curve appearing as if designed@@ <<linkappend "@@.usebtn; specifically for temptation.@@">> <<set _checkIn to random(1,2)>> <<if _checkIn eq 1>> <<video "characters/succubus/hunt6.1.mp4">> <<elseif _checkIn eq 2>> <<video "characters/succubus/hunt6.2.mp4">> <</if>> @@.mc-thoughts; The succubus smiles, beckoning the ghost closer, and he doesn't hesitate@@<br> @@color:red; Fuck me how you want, I'll be your little whore now@@<br> @@.mc-thoughts; The ghost enters her with a brutal force, each thrust filled with fury, she moans, yet her smile shows@@ <<linkappend "@@.usebtn; she's enjoying it.@@">> <<video "characters/succubus/hunt6.3.mp4">> @@.mc-thoughts;The ghost can't hold back, he cums inside her, his cum dripping from both her thoroughly fucked ass and pussy.@@<br><br> @@.backbtn; [[Continue|$return]]@@<br> <</linkappend>> <</linkappend>> <<elseif _check eq 5>> <<image "characters/succubus/hunt3.0.jpg" "displayCentredImgs">> @@.mc-thoughts; The ghost moves in on you, but out of nowhere, a surge of sensual magic cuts through the air. The succubus materializes, her very presence snagging the ghost's attention. Her figure exudes an aura of sexuality, with each contour and curve appearing as if designed@@ <<linkappend "@@.usebtn; specifically for temptation.@@">> <<set _checkIn to random(1,2)>> <<if _checkIn eq 1>> <<video "characters/succubus/hunt3.1.mp4">> <<elseif _checkIn eq 2>> <<video "characters/succubus/hunt3.2.mp4">> <</if>> @@.mc-thoughts; The succubus smiles, beckoning the ghost closer, and he doesn't hesitate@@<br> @@color:red; Fuck me how you want, I'll be your little whore now@@<br> @@.mc-thoughts; The ghost enters her with a brutal force, each thrust filled with fury, she moans, yet her smile shows@@ <<linkappend "@@.usebtn; she's enjoying it.@@">> <<video "characters/succubus/hunt3.3.mp4">> @@.mc-thoughts; The ghost can't hold back, he cums inside her, his cum dripping from her thoroughly fucked ass.@@<br><br> @@.backbtn; [[Continue|$return]]@@<br> <</linkappend>> <</linkappend>> <<elseif _check eq 6>> <<image "characters/succubus/hunt3.0.jpg" "displayCentredImgs">> @@.mc-thoughts; The ghost moves in on you, but out of nowhere, a surge of sensual magic cuts through the air. The succubus materializes, her very presence snagging the ghost's attention. Her figure exudes an aura of sexuality, with each contour and curve appearing as if designed@@ <<linkappend "@@.usebtn; specifically for temptation.@@">> <<set _checkIn to random(1,3)>> <<if _checkIn eq 1>> <<video "characters/succubus/hunt3.4.mp4">> <<elseif _checkIn eq 2>> <<video "characters/succubus/hunt3.5.mp4">> <<elseif _checkIn eq 3>> <<video "characters/succubus/hunt3.6.mp4">> <</if>> @@.mc-thoughts; The succubus smiles, beckoning the ghost closer, and he doesn't hesitate@@<br> @@color:red; Fuck me how you want, I'll be your little whore now@@<br> @@.mc-thoughts; the ghost enters her with brutal force, fucking her pussy and mouth, each thrust filled with fury, she moans, yet her smile shows@@ <<linkappend "@@.usebtn; she's enjoying it.@@">> <<video "characters/succubus/hunt3.7.mp4">> @@.mc-thoughts; The ghost can't hold back, he cums all over her face@@<br><br> @@.backbtn; [[Continue|$return]]@@<br> <</linkappend>> <</linkappend>> <</if>>
/* Entry point for a hunt. The lobby lives here -- the actual gameplay lives in HuntRun. Two arrival paths: 1. Fresh launch -- no run is active. HuntStart rolls modifiers + floor plan from $nextHuntSeed and stamps the run via setup.HuntController.startHunt. Static-plan houses (setup.HuntHouses) pass their catalogue id through $pendingHuntHouseId, which the GhostStreet card sets and HuntStart consumes once. 2. Resume -- a run is already active. The player got here via save/reload, browser back-button, or a sidebar nav while a run was in flight. HuntStart re-renders the lobby for the existing run without rolling fresh modifiers or a new seed. The address / modifier list / objective stay pinned to the run's original seed, so reloading the same save shows the same address. The "no resume" forfeit (clicking a GhostStreet card while a run is in flight) lives on the card widgets themselves -- they call setup.HuntController.endHunt(false) before navigating here, so the click ends the old run and HuntStart sees a clean slate. Putting the forfeit on the card click keeps save/reload paths from accidentally tripping it (rollNextSeed) and rotating the seed. */ <<if not setup.HuntController.isActive()>> <<set _huntSeed to setup.HuntController.nextSeed()>> <<set _huntStaticHouseId to $pendingHuntHouseId or null>> <<set $pendingHuntHouseId to null>> <<run setup.HuntController.startHunt({ seed: _huntSeed, staticHouseId: _huntStaticHouseId })>> <</if>> <<set _run to setup.HuntController.active()>> <<set _modifiers to setup.Modifiers.activeList()>> <<set _staticHouseId to setup.HuntController.staticHouseId()>> <<set _staticHouse to _staticHouseId ? setup.HuntHouses.byId(_staticHouseId) : null>> @@.location; <<= setup.HuntController.address().formatted>>@@<br> <<if _staticHouse and _staticHouse.description>> @@.mc-thoughts; <<= _staticHouse.description>>@@<br> <<else>> @@.mc-thoughts; A fresh hunt is waiting.@@<br> <</if>> <br> <<if _modifiers.length>> @@.location; Modifiers@@<br> <div id="hunt-lobby-modifiers"> <<for _m range _modifiers>> · <span class="usebtn" @title="_m.description"><<= _m.name>></span> -- <<= _m.description>><br> <</for>> </div> <span id="hunt-lobby-reroll"><<huntLobbyRerollControl>></span> <br> <</if>> @@.location; Objective@@<br> @@.mc-thoughts; <<= setup.HuntController.objectiveDescription(_run.objective) || _run.objective>>@@<br> <br> <<if setup.HuntController.huntAllowsCompanions() and setup.Companion and setup.Companion.hasActiveCompanion()>> <<set _ac to setup.Companion.active()>> <<if _ac>> <<run setup.Companion.autoAttachOnHuntStart()>> @@.mc-thoughts; <<= _ac.name>> is waiting for you out front.@@<br> @@.usebtn; <<link `"Talk to " + _ac.pronObj` "CompanionMain">> <</link>> @@<br> <br> <</if>> <</if>> @@.movebtn; [[Enter the hunt|HuntRun]]@@<br> @@.backbtn; [[Cancel|CityMap][setup.HuntController.end()]]@@
/* Placeholder hunt gameplay laid out to mirror the regular ghost hunts: minimap top-left, modifiers top-right, furniture-icon strip + HUD + tools/nav row at the bottom. The "tools" panel is a dashed placeholder until hunt tool gameplay lands. Furniture icons reuse the scenes/furniture/<suffix>.png set the authored haunts use, so e.g. a procedural kitchen still shows desk/table/sink1 thumbnails. */ <<if not setup.HuntController.isActive()>> @@.mc-thoughts; No active hunt.@@<br> @@.backbtn; [[Back|CityMap]]@@ <<else>> <<set _run to setup.HuntController.active()>> <<set _modifiers to setup.Modifiers.activeList()>> <<set _cr to setup.HuntController.currentRoomData()>> <<if _cr>> <<bodyBackground `setup.Styles.bgUrlForTemplate(_cr.template, setup.HuntController.isRoomDark(_cr.id), setup.HuntController.staticHouseId())`>> <</if>> <div class="hunt-run-layout"> <div id="hunt-tool-result" class="hunt-tool-result"></div> <div id="hunt-tool-meter" class="hunt-tool-meter"></div> <div class="hunt-run-top"> <div class="hunt-run-tl"> @@.location; <<= setup.HuntController.address().formatted>>@@<br> <<if _cr>> @@.mc-thoughts; <<= _cr.label>>@@<br> <</if>> <<huntMinimap>> </div> <div class="hunt-run-tr"> <<if _modifiers.length>> @@.location; Active modifiers@@<br> <<for _m range _modifiers>> <span class="usebtn hunt-modifier-chip" @title="_m.description"><<= _m.name>></span><br> <</for>> <</if>> </div> </div> <<set _detectorOn to setup.ToolController.detectorBought()>> <div class="hunt-run-furniture"> <<if _cr and _cr.furniture.length>> <<for _f range _cr.furniture>> <<capture _f>> <span @class="'hunt-furniture-item' + (_detectorOn and _f.lootKinds.length ? ' highlighted-furnitureDetector' : '')"> <<link `'<<image "scenes/furniture/' + _f.suffix + '.png">>'` "FurnitureSearch">> <<run setup.HuntController.setSearchedFurniture(_f.suffix)>> <<addTime 1>> <</link>> <span class="hunt-furniture-label"><<= _f.label>></span> </span> <</capture>> <</for>> <<elseif _cr>> @@.mc-thoughts; (bare room)@@ <<else>> /% _cr is null only when currentRoomId points to a non-existent room (corrupted save). Render nothing; the outer isActive gate is the player-visible recovery path for a missing $run. %/ <</if>> </div> <div class="hunt-run-bottom"> <div class="hunt-conditions"><<huntConditions>></div> <div class="hunt-run-hud"> <<huntFooterLight>> <span><<= setup.HuntController.address().formatted>></span> <span>Room: <<= _cr ? _cr.label : "—">></span> <span>Objective: <<= _run.objective>></span> <span>Ectoplasm: <<= setup.HuntController.ectoplasm()>> mL</span> </div> <div class="hunt-run-toolbar"> <div class="hunt-run-tools"> <<huntToolBar>> </div> <div class="hunt-run-companion"> <<companionCard>> </div> <div @class="'hunt-run-nav' + (_cr and _cr.neighbors.length gt 3 ? ' hunt-run-nav-compact' : '')"> <<if _cr and _cr.neighbors.length>> <<for _n range _cr.neighbors>> <<capture _n>> @@.movebtn;<<link _n.label "HuntRun">> <<run setup.HuntController.setCurrentRoom(_n.id)>> <<huntTickStep>> <</link>>@@<br> <</capture>> <</for>> <<else>> @@.mc-thoughts; (no exits)@@<br> <</if>> <<if _cr and _cr.template eq setup.FloorPlan.HALLWAY_TEMPLATE>> @@.movebtn; [[Outside|HuntOutside]]@@<br> <</if>> </div> </div> </div> </div> <</if>>
/* Closes the active hunt, pays out ectoplasm (mL), and prints the summary. The calling link stamps the outcome via setup.HuntController.markSuccess() / markFailure(reason); anything other than Outcome.SUCCESS counts as a failure so the player can never lose ectoplasm by navigating in via a stale link. Persistent unlocks are spent with the witch (WitchEctoplasm). */ <<if not setup.HuntController.isActive()>> @@.mc-thoughts; No run to end.@@<br> @@.backbtn; [[Back|CityMap]]@@ <<else>> <<set _success to setup.HuntController.isSuccess()>> <<set _summary to setup.HuntController.endHunt(_success)>> <<set _FR to setup.HuntController.FailureReason>> <<if _summary.success>> @@.notmc-speech; The ghosts were no match for you. Hunt #<<= _summary.number>> closes clean.@@<br> <<elseif _summary.failureReason eq _FR.SANITY>> @@.notmc-speech; Your mind gives out. Hunt #<<= _summary.number>> ends with sanity gone.@@<br> <<elseif _summary.failureReason eq _FR.EXHAUSTION>> @@.notmc-speech; Your legs give out. Hunt #<<= _summary.number>> ends in exhaustion.@@<br> <<elseif _summary.failureReason eq _FR.TIME>> @@.notmc-speech; Dawn breaks before the answer does. Hunt #<<= _summary.number>> ends with the clock.@@<br> <<elseif _summary.failureReason eq _FR.FLED>> @@.notmc-speech; You walk away from the haunt. Hunt #<<= _summary.number>> ends with the door at your back.@@<br> <<else>> @@.notmc-speech; The haunt swallows you. Hunt #<<= _summary.number>> ends in failure.@@<br> <</if>> <br> <span class="mc-action">+<<= _summary.payout>> mL of ectoplasm</span><br> <span class="mc-thoughts">Ectoplasm: <<= setup.HuntController.ectoplasm()>> mL</span><br> <span class="mc-action">+<<= _summary.xp>> exp</span><br> <br> <<if _summary.success>> @@.movebtn; [[Start a new hunt|HuntStart]]@@<br> <</if>> @@.backbtn;<<link "Continue" _summary.exitPassage>> <</link>>@@ <</if>>
/* The yard outside the haunt. Reached from HuntRun's hallway via the Outside nav link; only the hallway exposes that link. The run is still active here -- the player can pick the ghost (HuntIdentify), forfeit the run on the spot, or step back into the hallway and keep exploring. The hunt event chain is paused while the player is on this passage (HuntController.isHuntActive() answers off HuntRun only), matching the in-house ticks pausing when the player leaves the house. */ <<if not setup.HuntController.isActive()>> @@.mc-thoughts; No active hunt.@@<br> @@.backbtn; [[Back|CityMap]]@@ <<else>> @@.location; Outside the haunt@@<br> @@.mc-thoughts; The front door is at your back. You can size up what you've found, walk away, or step back inside.@@<br> <br> @@.movebtn; [[Identify the ghost|HuntIdentify]]@@<br> @@.movebtn; [[Flee the hunt|HuntSummary][setup.HuntController.markFailure(setup.HuntController.FailureReason.FLED)]]@@<br> @@.movebtn; [[Go back inside|HuntRun]]@@ <</if>>
/* Pick a ghost from the catalogue dropdown and lock it in. The guess is compared against setup.HuntController.ghostName() (the per-run ghost rolled at startHunt). The reveal lives in HuntIdentifyResolve so the prep beat + timed pause + correct/wrong branch all render in one place. */ <<if not setup.HuntController.isActive()>> @@.mc-thoughts; No active hunt.@@<br> @@.backbtn; [[Back|CityMap]]@@ <<else>> @@.location; Name the ghost@@<br> @@.mc-speech; I think it was:@@<br> <<ghostTypeDropdown>><br> @@.movebtn; [[Choose|HuntIdentifyResolve]]@@<br> <br> @@.backbtn; [[Back|HuntOutside]]@@ <</if>>
/* Resolves an identify attempt. The MC re-enters the haunt to subdue the ghost; after a short pause the run either closes peacefully (correct guess -- markSuccess + Continue/Go home) or the ghost catches the MC (wrong guess -- routes to HuntEnd, whose huntEndExit widget stamps a CAUGHT failure on its way to HuntSummary). Reveal staging: the result line and exit links are wrapped in .hunt-reveal (opacity:0, 1s opacity transition). The reveal text gets .show on render so it fades in immediately; the buttons get .show after a 1s <<timed>> nested inside the 6s outer wait, so they fade in only once the text has fully settled. */ <<if not setup.HuntController.isActive()>> @@.mc-thoughts; No active hunt.@@<br> @@.backbtn; [[Back|CityMap]]@@ <<else>> @@.mc-thoughts; You prepare, then confidently re-enter, ready to subdue the ghost and cleanse the house.@@<br> <<timed 6s>> <<if setup.HuntController.ghostName() eq setup.Ghosts.ghostTypeSelected()>> <<run setup.HuntController.markSuccess()>> <div class="hunt-reveal hunt-reveal-text">@@.notmc-speech; The ghost fades peacefully into the ether.@@</div> <div class="hunt-reveal hunt-reveal-buttons"> @@.movebtn; [[Continue|HuntSummary]]@@<br> @@.movebtn; [[Go home|HuntSummary]]@@ </div> <<else>> <<set _trueGhost to setup.Ghosts.active()>> <div class="hunt-reveal hunt-reveal-text">@@.mc-thoughts; Your heart sinks. It wasn't what you'd guessed -- it's a <<= _trueGhost.name>> bearing down on you, and every sign you talked yourself out of slams back into focus: <<= _trueGhost.evidenceLabels()>>. The ghost roughly grabs your helpless form before you can run.@@</div> <div class="hunt-reveal hunt-reveal-buttons"> @@.movebtn; [[Continue|HuntEnd]]@@ </div> <</if>> <<done>> <<run $(".hunt-reveal-text").addClass("show")>> <</done>> <<timed 1s>> <<run $(".hunt-reveal-buttons").addClass("show")>> <</timed>> <</timed>> <</if>>
/* Energy as the pacing gate: the per-step energy drain in * setup.HauntConditions.applyTickEffects sets $exhausted = 1 when * mc.energy bottoms out, and the includeTimeEvent* widgets route here. * Cleans up like HuntOverManual / HuntOverTime — graceful exit, no * ghost catch — so the player keeps whatever evidence they gathered. * * Departure from the other hunt-over branches: the player only has the * strength to grab ONE stolen piece before stumbling out. Picking one * runs the matching restore then loseAllStolen nukes the rest. * * Exhibitionism gate: a low-exhibitionism player (< 5, the same * threshold CompanionMain / FindStolenClothes / NudityEvent use for * their "you don't mind being seen naked" branches) won't walk out * exposed. If they're bottomless AND a bottom-ish item was stolen, only * the panties/bottoms grabs are offered. If they're top-bare AND a top- * ish item was stolen, only the shirt/bra grabs are offered. With both * exposed and both kinds available, any covering grab is shown. "Leave * with nothing" is hidden whenever the gate forces a covering grab. */ <<run setup.Ghosts.markActiveProwlEvent()>> <<run setup.Ghosts.fireActiveHuntEnd()>> <<run setup.HauntedHouses.endHunt()>> <<run setup.HauntedHouses.cleanupAfterHunt()>> <<set _bottomless to setup.HauntedHouses.isBottomless()>> <<set _topBare to setup.HauntedHouses.isTopBare()>> <<set _modest to (setup.Mc.exhibitionism() || 0) lt 5>> <<set _canCoverBottom to _bottomless and (setup.Wardrobe.isPantiesStolen() or setup.Wardrobe.isBottomStolen())>> <<set _canCoverTop to _topBare and (setup.Wardrobe.isShirtStolen() or setup.Wardrobe.isBraStolen())>> <<set _forceCover to _modest and (_canCoverBottom or _canCoverTop)>> <<set _showBottom to not _forceCover or _canCoverBottom>> <<set _showTop to not _forceCover or _canCoverTop>> <<image "ui/img/dawn.jpg" { width: "100%" }>> <br> @@.mc-thoughts; My legs are shaking. I can barely keep my eyes open. I have to leave this place — I'm running on empty.@@<br> <<if setup.HauntedHouses.hasClothesStolen()>> @@.mc-thoughts; The ghost stripped me earlier; my things are scattered around. I only have the energy to grab one piece before stumbling for the exit.@@<br> <<if _forceCover>> @@.mc-thoughts; <<if _canCoverBottom and _canCoverTop>> ...and there's no way I'm walking out like this. I have to cover up — top or bottom, something. <<elseif _canCoverBottom>> ...and there's no way I'm walking out bottomless. I need something to put on down there. <<else>> ...and there's no way I'm walking out topless. I need something to cover my chest. <</if>> @@<br> <</if>> <span id="exhaustionGrab"> <<if setup.Wardrobe.isPantiesStolen() and _showBottom>> @@.usebtn;<<link "Grab your panties">><<replace "#exhaustionGrab">> <<run setup.Wardrobe.restoreStolenInGroup("panties", "isPantiesStolen")>> <<run setup.Wardrobe.loseAllStolen()>> <<run setup.HauntedHouses.clearStolenClothesFlag()>> @@.mc-action; You snatch your panties and stumble for the exit. The rest stays behind.@@<br> @@.movebtn;[[Drag yourself home|CityMap][setup.Time.addHours(1)]]@@ <</replace>> <</link>>@@<br> <</if>> <<if setup.Wardrobe.isBottomStolen() and _showBottom>> @@.usebtn;<<link "Grab your bottoms">><<replace "#exhaustionGrab">> <<run setup.Wardrobe.restoreStolenInGroup("bottomOuter")>><<run State.variables.isBottomStolen = 0>><<run State.variables.isJeansStolen = 0>><<run State.variables.isShortsStolen = 0>><<run State.variables.isSkirtStolen = 0>> <<run setup.Wardrobe.loseAllStolen()>> <<run setup.HauntedHouses.clearStolenClothesFlag()>> @@.mc-action; You snatch your bottoms and stumble for the exit. The rest stays behind.@@<br> @@.movebtn;[[Drag yourself home|CityMap][setup.Time.addHours(1)]]@@ <</replace>> <</link>>@@<br> <</if>> <<if setup.Wardrobe.isShirtStolen() and _showTop>> @@.usebtn;<<link "Grab your shirt">><<replace "#exhaustionGrab">> <<run setup.Wardrobe.restoreStolenInGroup("tshirt", "isShirtStolen")>> <<run setup.Wardrobe.loseAllStolen()>> <<run setup.HauntedHouses.clearStolenClothesFlag()>> @@.mc-action; You snatch your shirt and stumble for the exit. The rest stays behind.@@<br> @@.movebtn;[[Drag yourself home|CityMap][setup.Time.addHours(1)]]@@ <</replace>> <</link>>@@<br> <</if>> <<if setup.Wardrobe.isBraStolen() and _showTop>> @@.usebtn;<<link "Grab your bra">><<replace "#exhaustionGrab">> <<run setup.Wardrobe.restoreStolenInGroup("bra", "isBraStolen")>> <<run setup.Wardrobe.loseAllStolen()>> <<run setup.HauntedHouses.clearStolenClothesFlag()>> @@.mc-action; You snatch your bra and stumble for the exit. The rest stays behind.@@<br> @@.movebtn;[[Drag yourself home|CityMap][setup.Time.addHours(1)]]@@ <</replace>> <</link>>@@<br> <</if>> <<if not _forceCover>> @@.usebtn;<<link "Leave with nothing">><<replace "#exhaustionGrab">> <<run setup.Wardrobe.loseAllStolen()>> <<run setup.HauntedHouses.clearStolenClothesFlag()>> @@.mc-action; You can't even manage that. You stagger for the door empty-handed.@@<br> @@.movebtn;[[Drag yourself home|CityMap][setup.Time.addHours(1)]]@@ <</replace>> <</link>>@@<br> <</if>> </span> <<else>> @@.movebtn;[[Drag yourself home|CityMap][setup.Time.addHours(1)]]@@<br> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<run setup.Ghosts.markActiveProwlEvent()>> <<run setup.Ghosts.fireActiveHuntEnd()>> @@.mc-speech;I am leaving this accursed house. It seems I've done everything I could.@@<br> <<if setup.HauntedHouses.hasClothesStolen()>> <<image "ui/img/confused-img.jpg" "displayCentredImgs">> @@.mc-speech; Damn! It looks like that disgusting ghost took my clothes... Maybe I should go back and look for it? Though I really don't want to return to that cursed house.@@<br> /% Don't clear the stolen-clothes flag here -- the "Return to the house" branch needs FurnitureSearch's hasClothesStolen() guard to still pass so the player can recover the stash. The "Leave without taking your clothes" branch calls loseAllStolen, which clears the flag itself. %/ @@.movebtn; <<back "Return to the house">>@@<br> Or<br> <<if setup.Wardrobe.worn(setup.WardrobeSlot.TSHIRT) and setup.Companion.hasBottomWorn()>> @@.movebtn;<<link "Leave without taking your clothes" "Livingroom">><<run setup.Wardrobe.loseAllStolen()>> <</link>>@@ <<else>> @@.movebtn;<<link "Leave without taking your clothes" "NudityEvent">><<run setup.Wardrobe.loseAllStolen()>> <</link>>@@ <</if>> <<else>> <<set _hg to setup.Ghosts.active()>> <<if _hg and _hg.goHomePassage>> @@.movebtn;<<link "Go home" `_hg.goHomePassage`>> <<run setup.Wardrobe.loseAllStolen()>><<run setup.Time.addHours(1)>><</link>>@@ <<else>> @@.movebtn;[[Go home|Livingroom][setup.Time.addHours(1)]]@@<br> <</if>> <</if>> <br> <<run setup.HauntedHouses.endHunt()>> <<run setup.HauntedHouses.cleanupAfterHunt()>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<run setup.Ghosts.markActiveProwlEvent()>> <<set _hg to setup.Ghosts.active()>>  @@.mc-thoughts;Your mind succumbs to the pressure of darkness and horrors enveloping you. Everything around you merges into a black void@@<br> @@.enterbtn;<<linkreplace "Next">> <<if _hg and _hg.canTentacles>> <<set _sanityTentacleVids to ["mechanics/tentacles/2.0.mp4", "mechanics/tentacles/1.2.mp4", "mechanics/tentacles/2.2.mp4", "mechanics/tentacles/2.3.mp4", "mechanics/tentacles/2.1.mp4"]>> <<randomVideoFromList _sanityTentacleVids>> <<elseif setup.HauntedHouses.isIronclad()>> <<set _check to random(1,3)>> <<video "scenes/prison/sanity" + _check + ".mp4">> <<else>> <<set _check to random(1,7)>> <<video "mechanics/sanityover/" + _check + ".mp4">> <</if>> <br>  @@.mc-thoughts;Periodically, moments of realization break through: you are being fucked, not sparing all your holes. Your body becomes pliable, you feel like a doll. This goes on forever. However, your body reacts to all this torture; the feeling of pleasure gradually takes over. A powerful surge of enjoyment passes through it. You feel the strength leaving your body, and consciousness slips away.@@<br> <<if setup.Ghosts.hasHighPriestess()>> @@.usebtn; [[Next|$return][setup.Ghosts.consumeHighPriestess()]]@@ <<else>> <<run setup.HauntedHouses.cleanupAfterHunt({ loseStolen: true })>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> @@.movebtn;[[Next|Sleep]]@@ <</if>> <</linkreplace>>@@ <<run setup.HauntedHouses.endHunt()>>
<<run setup.Ghosts.markActiveProwlEvent()>> <<run setup.Ghosts.fireActiveHuntEnd()>> <<image "ui/img/dawn.jpg" { width: "100%" }>> <br> @@.mc-thoughts; Ah, dawn. The ghostly activity has ceased. I need to summarize the gathered information and identify the type of ghost.@@<br> <<if setup.HauntedHouses.hasClothesStolen()>> @@.mc-thoughts; Now that you're no longer in danger, you can retrieve your clothes. After finding them, you head away from this cursed place.@@ <<if setup.Wardrobe.isPantiesStolen()>><<run setup.Wardrobe.restoreStolenInGroup("panties", "isPantiesStolen")>><</if>> <<if setup.Wardrobe.isBottomStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bottomOuter")>><<run State.variables.isBottomStolen = 0>><<run State.variables.isJeansStolen = 0>><<run State.variables.isShortsStolen = 0>><<run State.variables.isSkirtStolen = 0>><</if>> <<if setup.Wardrobe.isShirtStolen()>><<run setup.Wardrobe.restoreStolenInGroup("tshirt", "isShirtStolen")>><</if>> <<if setup.Wardrobe.isBraStolen()>><<run setup.Wardrobe.restoreStolenInGroup("bra", "isBraStolen")>><</if>> <<run setup.HauntedHouses.clearStolenClothesFlag()>> <</if>> <<run setup.HauntedHouses.endHunt()>> <<run setup.HauntedHouses.cleanupAfterHunt()>> @@.movebtn;[[Leave|CityMap][setup.Time.addHours(1)]]@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* huntLobbyRerollControl -- arg-less. Renders the lobby's reroll-charge button when the player has at least one charge stockpiled, and nothing otherwise. Clicking the button consumes a charge, redrafts the run's modifiers, repaints the modifier list, and re-invokes this widget so its own visibility / "(you have N)" label stay current. The caller is responsible for wrapping the widget in a stable id (the lobby uses #hunt-lobby-reroll) so the click handler's <<replace>> can drop the button entirely once charges hit 0. */ <<widget "huntLobbyRerollControl">> <<if setup.HuntController.rerollCharges() gt 0>> @@.movebtn; <<link "Spend reroll charge (you have <<= setup.HuntController.rerollCharges()>>)">> <<run setup.HuntController.consumeRerollCharge()>> <<run setup.HuntController.redraftRunModifiers()>> <<replace "#hunt-lobby-modifiers">> <<set _modifiers to setup.Modifiers.activeList()>> <<for _m range _modifiers>> · <span class="usebtn" @title="_m.description"><<= _m.name>></span> -- <<= _m.description>><br> <</for>> <</replace>> <<replace "#hunt-lobby-reroll">> <<huntLobbyRerollControl>> <</replace>> <</link>>@@<br> <</if>> <</widget>>
/* huntMinimap -- arg-less. Renders the active run's floor plan as an SVG map: one labeled square per room, lines between connected rooms. The current room is highlighted; spawn and boss rooms get their own border colours. Layout (BFS depth -> col, sibling order -> row) and SVG markup come from setup.HuntController.minimapSvg(). Clicking the wrapper toggles a collapsed thumbnail mode anchored at the top-left, so the player can free up the upper-left column to read other UI. The collapsed flag lives on setup.HuntController (module state) so it survives the HuntRun re-render that fires on every room move. Renders nothing when no hunt is active (keeps the widget cheap to drop into shared passages without an outer guard). */ <<widget "huntMinimap">> <<set _mmSvg to setup.HuntController.minimapSvg()>> <<if _mmSvg>> <<set _mmCollapsed to setup.HuntController.isMinimapCollapsed()>> <div @class="'hunt-minimap' + (_mmCollapsed ? ' hunt-minimap-collapsed' : '')" onclick="SugarCube.setup.HuntController.toggleMinimapCollapsed(); this.classList.toggle('hunt-minimap-collapsed');"> <span class="location">Floor plan</span><br> <<= _mmSvg>> </div> <</if>> <</widget>>
/* huntFooterLight -- arg-less. Hunt counterpart of <<roomFooterLight>>: two image links that toggle the current room's light/dark state and re-render HuntRun so the body background re-resolves through setup.Styles.bgUrlForTemplate(template, dark). State lives on $run.lights keyed by floor-plan room id so each room remembers its setting independently; the cursedHuntLinkDisable wrapper gates clicks while a hunt is active, matching the haunted-house widget's behavior. */ <<widget "huntFooterLight">> <<set _roomId to setup.HuntController.currentRoomId()>> <<if _roomId>> <<capture _roomId>> <div class="hunt-run-lights"> <span class="cursedHuntLinkDisable"><<link "<<image \"ui/img/lighton.png\">>" "HuntRun">><<run setup.HuntController.setRoomLight(_roomId, setup.RoomLight.LIT)>> <</link>> <<link "<<image \"ui/img/lightoff.png\">>" "HuntRun">><<run setup.HuntController.setRoomLight(_roomId, setup.RoomLight.DARK)>> <</link>></span> </div> <</capture>> <</if>> <</widget>>
/* huntToolBar -- arg-less. Renders one tool card per entry in setup.HuntController.startingTools(), which folds the run's loadout and the Empty Bag modifier into the canonical setup.searchToolOrder: default runs show all six (EMF, Ectoglass, GWB, Spiritbox, Thermometr, UVL); a loadout that names a subset shows just those; Empty Bag collapses the strip to a "no tools" placeholder. Per-slot markup lives in <<huntToolSlot>> below. setup.ensureHuntSearchBag (ToolController) seeds the per-tool counter object the meter reads from. */ <<widget "huntToolBar">> <<set _tools to setup.HuntController.startingTools()>> <<if _tools.length eq 0>> <div class="hunt-tool-card hunt-tool-card-empty"> @@.mc-thoughts; (your bag is empty)@@ </div> <<else>> <<run setup.ensureHuntSearchBag()>> <<for _t range _tools>> <<set _def to setup.searchToolDefs[_t]>> <<capture _t, _def>> <div class="hunt-tool-card"> <<image "ui/img/" + _def.iconFile { class: "hunt-tool-icon" }>> <<huntToolSlot _t>> </div> <</capture>> <</for>> <</if>> <</widget>> /* huntToolSlot -- args[0] = tool key. Renders the link for one hunt tool slot. Click starts a <<repeat>>-driven meter that mirrors <<searchTool>>: each tick fires <<huntTickEventChain>> + <<toolTick>>, the meter completes after `$equipment.<tool>` ticks, and the result is wikified into the shared #hunt-tool-result tray. The meter element renders into the shared #hunt-tool-meter container at the top of the layout (see HuntRun) -- not per-card -- so the toolbar row keeps its compact icon-plus-label sizing whether or not a tick is in flight. Differences from the in-house <<searchTool>>: * Uses <<link>> (multi-use) so the player can re-fire the same tool without leaving HuntRun -- the in-house markup relies on the room re-rendering on nav, which doesn't happen here. * Routes the completion check into #hunt-tool-result rather than a per-tool actionSel -- the layout has one shared readout area. * Adds a sanity/exhaustion guard after <<applyTickEffects>> so a stat-collapse landed by the click routes to HuntSummary immediately instead of waiting for the next nav. * Refreshes the .hunt-conditions HUD after the tick so per-step deltas + contributor chips track stat changes from the click. The shared bridges (setup.Ghosts.active / setup.isGhostHere / setup.HuntController.huntOverPassage) make the per-tick chain reusable. Tools whose searchToolDefs entry sets needsLightCheck (currently spiritbox) are gated on the current room being dark -- mirroring the lights-off guard the in-house <<searchTool>> markup emits. When the room is lit the click routes a "turn the lights off first" prompt into #hunt-tool-result instead of starting the meter; the predicate reads through setup.HuntController.isCurrentRoomDark so the catalogue flag drives the rule, no per-tool branch in the widget. */ <<widget "huntToolSlot">> <<set _t to _args[0]>> <<set _def to setup.searchToolDefs[_t]>> <<set _meterName to "searchHunt" + _def.meterField>> <<set _equipField to _def.equipField>> <<capture _t, _def, _meterName, _equipField>> <span class="hunt-tool-card-label cardlink" @data-tool="_t">@@.adaptiveLink;<<link `_def.label`>> <<if _def.needsLightCheck and not setup.HuntController.isCurrentRoomDark()>> <<replace "#hunt-tool-result">> <div class="spiritbox-container mc-thoughts">I need to turn off the light first</div> <</replace>> <<else>> <<addclass ".cardlink" "disabled-link">> <<replace "#hunt-tool-meter">> <<showmeter _meterName `$currentsearchHunt[_t] / $equipment[_equipField]`>> <</replace>> <<repeat `$timerToolsDecreased`>> <<if $currentsearchHunt[_t] neq $equipment[_equipField]>> <<huntTickEventChain>> <</if>> <<if $currentsearchHunt[_t] lte ($equipment[_equipField] - 1)>> <<toolTick>> <<set $currentsearchHunt[_t] += 1>> <<updatemeter _meterName `$currentsearchHunt[_t] / $equipment[_equipField]`>> <<elseif $currentsearchHunt[_t] gte $equipment[_equipField]>> <<replace "#hunt-tool-result">> <<if _t eq "temperature">> <<include "TemperatureHigh">> <<else>> <<toolCheck _t>> <</if>> <</replace>> <<replace "#hunt-tool-meter">><</replace>> <<applyTickEffects>> <<replace ".hunt-conditions">><<huntConditions>><</replace>> <<set $currentsearchHunt[_t] to 0>> <<removeclass ".cardlink" "disabled-link">> <<if setup.Mc.isSanityCollapsed() or setup.Mc.sanity() lte 0>> <<goto setup.HuntController.huntOverPassage("sanity")>> <<elseif setup.Mc.isExhausted()>> <<goto setup.HuntController.huntOverPassage("exhaustion")>> <<else>> <<stop>> <</if>> <</if>> <</repeat>> <</if>> <</link>>@@</span> <</capture>> <</widget>>
Ghost in M'Sheet<br> <br> <div class="kbnav-banner">Hold <b>Alt</b> (or <b>⌘ Cmd</b> on Mac) to see keyboard navigation options.</div> <br> <b>What's your extra sensitive spot?</b><br> <em>The chosen one will occur more frequently during the ghost hunt than the other body parts, bringing more lust.</em><br> <<bodyPartRadio "brain" "Mind">> <<bodyPartRadio "tits" "Boobs">> <<bodyPartRadio "ass" "Ass">> <<bodyPartRadio "mouth" "Tongue">> <<bodyPartRadio "pussy" "Pussy">> <<bodyPartRadio "anal" "Anus">> Enter your name here: <<mcNameTextbox "Mary" "Intro1">>and press "Enter". <br> Or just click @@.enterbtn;<<link "here" "Intro1">><<run setup.Mc.setName("Mary")>> <</link>>@@ <br> <br> <br> @@.mc-thoughts;This game is similar to games like Phasmophobia, Demonologist, etc., so if you've played such games, there shouldn't be any difficulties. Nevertheless, here's a brief guide to the game:@@ <br> @@.enterbtn;[[Player guide -> Evidence]]@@
<div style="display: flex; align-items: center;"> <div style="flex: 1;">    You are <<= setup.Mc.name()>>, a brave young woman who has devoted much of her free time to studying esoterics, mysticism, and the unexplainable. Somehow, it drew you more than anything else, perhaps because in your world, incredible creatures, from ghosts to demons, have started appearing. This has been going on for quite some time.   The world has changed, and society has changed with it. People have grown accustomed to such anomalies, but there are cases when certain measures have to be taken. This led to the emergence of new professions: ghost hunters, witches, exorcists, and so on.</div> <div style="flex: 1; display: flex; justify-content: center; align-items: center;"> <<image "ui/img/mc.jpg" { width: "80%" }>><br> </div> </div>   @@.mc-speech; Such professions are quite dangerous, but the risk is worth it: they pay quite well@@ - you think.   And so, you have dedicated yourself to this. You are a ghost hunter. Of course, you lack experience; you have some knowledge and minimal inexpensive equipment, but you have a strong desire to start contributing to society and, well, to earn some money.   You live alone in a small town. However, even here, there is work for you. They say there's a witch nearby who can help you with your job. She provides contracts for ghosts. Most likely, she is a middleman or something similar.   @@.mc-speech; I think it's best to head to the witch first. She should advise me on what to do.@@ @@.mc-action; Visit the witch, she should provide details.@@ @@.enterbtn;[[Start|CityMap]] @@
/* * UI bindings for the character-creation form. SugarCube's * <<radiobutton>> and <<textbox>> macros require the backing * variable as a literal "$name.path" string, so the $ref has * to live somewhere -- we corral all of them into this widget * passage (which sits next to IntroController) so the Intro * passages themselves never name a global directly. */ <<widget "bodyPartRadio">> /* _args[0] = body-part key, _args[1] = display label */ <label><<radiobutton `"$sensualBodyPart." + _args[0]` setup.Intro.CHOSEN_SENSITIVITY autocheck>> _args[1]</label><br> <</widget>> <<widget "mcNameTextbox">> /* _args[0] = default name, _args[1] = passage to advance to */ <<textbox "$mc.name" _args[0] _args[1]>> <</widget>>
<div class="flexwrapper gap"> <<for _i, _comic range setup.Library.comics>> <<capture _i>> <div class="housecardComics"> <<image _comic.prefix + "001.jpg" "comic-cover">><br> @@.enterbtn;<<link "read" "ReadComics">><<run setup.Library.selectComics(_i + 1)>> <</link>>@@ </div> <</capture>> <</for>> </div> <br> @@.backbtn;[[Leave|LibraryInside]] @@<br> <<addclass "body" "style-comics">> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<image "ui/img/library.jpg" { width: "100%" }>> <br> @@.location; Library@@<br> @@.mc-thoughts; This library boasts a diverse collection of books, including both modern publications and rare antique editions. Although most people prefer to search for information online, a few still visit, perhaps in search of more unusual and unique insights.@@<br> <br> <<if setup.Library.isOpen()>> @@.enterbtn;[[Enter the library|LibraryInside]]@@ <</if>> <br> <br> @@.backbtn;[[Leave|CityMap]]@@ <br> <<if previous(2) is "Library">><<addTime 0.5>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 0.5>><</if>>
<<if setup.Library.brookIsPossessed()>> <<image "ui/img/library-inside.jpg" { width: "100%" }>> @@.mc-speech; She's not there... strange...@@<br><br> @@.backbtn; [[Leave|LibraryInside]] @@<br> <<else>> <<if setup.Library.brookIsWithRain()>> <<image "ui/img/library-inside.jpg" { width: "100%" }>> @@.mc-thoughts;She's probably still with Rain. Maybe it's worth waiting a couple of days. @@<br><br> @@.backbtn; [[Leave|LibraryInside]] @@<br> <<else>> <<run setup.Library.refreshBrookSoloChances()>> <<image "characters/brook/brook-library.jpg" { width: "30%" }>> <br> <<if not setup.Library.hasMetBrook()>> <<run setup.Library.meetBrookFirstTime()>> @@.mc-thoughts; You are absorbed in searching for a book in the library when you suddenly notice a girl approaching you.@@<br> @@.notmc-speech; It's so hard to find the right book, isn't it?@@<br> @@.mc-speech; Yeah, especially when you're looking for books about ghosts@@<br> @@.notmc-speech; Oh, you're into that? I wouldn't have guessed... I've always dreamed of ghost hunting. I forgot to introduce myself, my name is Brook.<br> By the way, I found some information about a rare ghost here in the library. @@<br> @@.mc-speech; Nice to meet you, I'm <<= setup.Mc.name()>>. <br>Brook, that's exactly what I'm looking for. Can you share it with me?@@<br> @@.notmc-speech; Well... how about a deal? I'll give you the information, and in return, we go ghost hunting together?@@<br> @@.mc-speech; Sure, of course. Actually, I could use a helper@@<br> @@.notmc-speech; Yay! Thank you so much! I usually spend entire days here in the library, so when you're ready to go ghost hunting, just find me here.@@<br> @@.mc-speech; Alright. See you then!@@<br> <br> @@.mc-thoughts; She handed you some papers and left. It turns out she found information about the ghost Mimic.@@<br> <br> @@.mc-action; The information about the Mimic ghost has been added to your Ghostopedia.@@<br> <br> <<run setup.Ghosts.markDiscovered("Mimic")>> @@.mc-thoughts; So now, I can go ghost hunting with my new friend, Brook. I just need to head to the library and find her.@@<br> <br> @@.mc-action; You can now ask Brook to join you on a ghost hunt!@@<br> <<else>> @@.mc-thoughts; After a few minutes of searching, you found Brook@@<br> <<if setup.Library.brookSoloHuntReporting()>> @@.mc-speech; [[Ask her how her ghost hunt went.|BrookHuntEndAlone]]@@<br> <<else>> @@.mc-speech;<<link "Ask Brooke to join you for ghost hunting tonight.">> <<run setup.Library.pickBrookAsCompanion()>> <<replace "#brookInfoAnswer">>@@.mc-speech; I want you to join me for ghost hunting today@@<br> @@.notmc-speech; Yes, of course. I'll be ready. Let's meet by the entrance to the haunted house, okay?@@<br> @@.mc-speech; Yeah, let's do that.@@ <</replace>> <</link>>@@<br> <span class="CompanionInfoAskForHuntAlone"> @@.mc-speech;<<link "I'd like you to go ghost hunting alone.">> <<replace "#brookInfoAnswer">>@@.notmc-speech; I think I'm already experienced enough to do it on my own. Where should I go?@@<br> @@.enterbtn;<<link `"Owaissa Street - " + setup.Library.chanceBrookAloneOwaissa() + " %"`>> <<run setup.Library.pickBrookForSoloOwaissa()>> <<if setup.Mc.money() lt 20>> <<replace "#brookInfoAnswerTwo">>@@.warningtext; I don't have enough money to buy her a contract @@ <</replace>> <<else>> <<replace "#brookInfoAnswerTwo">>@@.notmc-speech;Owaissa Street? Hmm... Yes, of course. I think I can handle it.@@ <</replace>> <</if>> <</link>>@@ @@.enterbtn;<<link `"Elm Street - " + setup.Library.chanceBrookAloneElm() + " %"`>> <<run setup.Library.pickBrookForSoloElm()>> <<if setup.Mc.money() lt 20>> <<replace "#brookInfoAnswerTwo">>@@.warningtext; I don't have enough money to buy her a contract @@ <</replace>> <<else>> <<replace "#brookInfoAnswerTwo">>@@.notmc-speech;Elm Street? Hmm... Yes, of course. I think I can handle it.@@ <</replace>> <</if>> <</link>>@@@@color: green; <b>-20$</b>@@<br> <span id="brookInfoAnswerTwo"> </span> <</replace>> <</link>>@@<<if setup.Companion.companionLvl('Brook') lt 2>> @@.warningtext; Req. Brook's lvl 2+@@ <</if>></span> <br> <span id="brookInfoAnswer"> </span> <<if setup.Companion.companionLvl('Brook') lt 2>> <<done>> <<addclass ".CompanionInfoAskForHuntAlone" "disabled-link">> <</done>> <</if>> <</if>> <br> <</if>> <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> @@.backbtn; [[Leave|LibraryInside]] @@<br> <</if>> <</if>>
@@.mc-thoughts; A heavy book has been pushed back behind the others on the shelf, like someone wanted it forgotten. The cover reads "A Hunter's Companion -- Tips and Field Notes."@@<br> <<image "scenes/library/desecrated-book.png" "libraryCenteredImg">><br> @@.mc-thoughts; You open it -- and the binding sags wrong in your hands. Half the pages are gone, ripped out at the spine. What's left is smeared with something cold and translucent, the same glassy slime you've been finding in the haunted rooms. Ectoplasm.@@<br> <br> @@.mc-speech; ...something didn't want me reading this.@@<br> <br> @@.mc-thoughts; Whatever did this couldn't have carried the pages far. They have to be in the library somewhere -- tucked between other books, slid under shelves, dropped behind the stacks. Worth keeping an eye out next time you come to search.@@<br> <<run setup.Library.markDesecratedBookFound()>> <br> @@.backbtn; [[Leave|LibraryInside]]@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
@@.mc-thoughts; You slowly walk past the shelves deeper into the library, carefully examining each one. Suddenly, your gaze stops on an ancient book that stands out from the rest.@@ <br> <<image "scenes/library/book1.jpg" "libraryCenteredImg">><br> <<if not setup.Ghosts.hasDiscovered("Phantom")>> <<run setup.Ghosts.markDiscovered("Phantom")>> As you open it, you find a chapter dedicated to Phantoms.<br> The description reveals that Phantoms have a distinctive feature that makes them easily identifiable--they cannot turn off the lights. This means that in their presence, light sources always remain on. If you notice that the lights do not go out, it could be a sign that a Phantom is nearby.<br> <<elseif not setup.Ghosts.hasDiscovered("Shade")>> <<run setup.Ghosts.markDiscovered("Shade")>> As you open it, you find a chapter dedicated to Shades.<br> Shade -- one of the oldest types of ghosts. The main feature of the Shade is that the lower your sanity, the less likely the Shade is to show interest in you.<br> <<elseif not setup.Ghosts.hasDiscovered("Goryo")>> <<run setup.Ghosts.markDiscovered("Goryo")>> Goryo is known for its attachment to a single room and cannot change it like other ghosts do. If you notice that the ghost's activity is focused exclusively in one area, you are likely dealing with a Goryo.<br> <<else>> You try to find something useful in this book, but you only come across information you already know.<br> <</if>> @@.mc-thoughts;After you finish reading, fatigue overcomes you. You decide to return to the reading area, where you can rest and collect your thoughts, leaving the bookshelves and their secrets behind.@@ <br> <br> @@.backbtn; [[Leave|LibraryInside]]@@ <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
You wander from shelf to shelf, searching for something interesting. Suddenly, you notice a beautiful girl. <<randRangeImg "scenes/library/woman" 1 5 ".jpg">><br> @@.mc-thoughts;All your attention is focused on her. @@<br> @@.mc-speech; You watch until she leaves.@@<br> <<addLust 30>> <<if setup.Mc.corruption() lt 3>><<run setup.Library.gainSmallCorruption()>> + 0.1 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> + 30 <<statIcon setup.StatIcon.HEALTH>><br> <br> @@.backbtn; [[Leave|LibraryInside]]@@ <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<if setup.Library.wearingPants()>> <<video "scenes/library/1.mp4">> <<elseif setup.Library.wearingSkirt()>> <<video "scenes/library/2.mp4">> <</if>> You were examining the books in search of something useful when a guy approached from behind and started groping you.<br> @@.mc-speech; Oh~ Hey! What do you think you're doing?!@@<br> @@.mc-thoughts; But he continues to touch you.@@<br> + 15 <<statIcon setup.StatIcon.HEALTH>><br> <<if setup.Mc.corruption() lt 1>> @@.mc-speech; [[Stop it right now, or I'll scream|LibraryInside]]@@ @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 1)@@ <<else>> @@.mc-thoughts; Maybe I should [[stay silent|LibraryGuy1]]. Perhaps he'll leave me alone on his own...@@ <</if>> <<addLust 15>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<if setup.Library.wearingPants()>> <<video "scenes/library/1.1.mp4">> @@.mc-thoughts; He took off your clothes and started touching your butt.@@<br> <<if setup.Mc.corruption() lt 2>><<run setup.Library.tryGainGropingCorruption(2, 0.1)>> + 0.1 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> + 30 <<statIcon setup.StatIcon.HEALTH>><br> <<addLust 30>> @@.mc-speech; We have to stop! Someone might see what we're doing here. @@<br> @@.notmc-speech; Come on, suck me off real quick, no one will catch us. @@<br> <<if setup.Mc.corruption() lte 3>> @@.mc-speech; Ha~, [[no way.|LibraryInside]]@@ @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 4)@@<br> <<else>> @@.mc-speech; Well, okay, but keep an eye out to make sure <<linkappend "no one sees us.">> <<video "scenes/library/1.2.mp4">> @@.mc-speech; Slurp~Slurlp~ If someone sees us... Fuck! This thought makes my pussy even wetter, am I really such a slut?@@<br> + 30 <<statIcon setup.StatIcon.HEALTH>><br> <<if setup.Mc.corruption() lte 6>><<run setup.Library.tryGainGropingCorruption(6, 0.2)>> + 0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <<addLust 30>> @@.notmc-speech; Oh~ you're such a bad girl.<br> See, no one noticed us, let's have a quick fuck right here@@<br> @@.mc-speech; No! I have [[to go|LibraryInside]]@@<br> <</linkappend>>@@<br> <</if>> <<elseif setup.Library.wearingSkirt()>> <<video "scenes/library/2.1.mp4">> @@.mc-speech; Ah~ you know how to please a woman. @@<br> @@.notmc-speech; What about you? I see that you like it, maybe you can help me now too.@@<br> <<if setup.Mc.corruption() lt 2>><<run setup.Library.tryGainGropingCorruption(2, 0.1)>> + 0.1 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> + 30 <<statIcon setup.StatIcon.HEALTH>><br> <<addLust 30>> <<if setup.Mc.corruption() lte 3>> @@.mc-speech; Ha~, [[no way.|LibraryInside]]@@ @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 4)@@<br> <<else>> @@.mc-speech; Alright, you can consider yourself deserving of <<linkappend "this.">> <<randomVideo "scenes/library/2.2.mp4" "scenes/library/2.3.mp4">> @@.mc-speech; Why am I doing this? Fuck, my pussy is so wet ❤️@@<br> + 30 <<statIcon setup.StatIcon.HEALTH>><br> <<if setup.Mc.corruption() lte 6>><<run setup.Library.tryGainGropingCorruption(6, 0.2)>> + 0.2 <<statIcon setup.StatIcon.CORRUPTION>><br> <</if>> <<addLust 30>> @@.notmc-speech; Oh~ You're really good at this...<br> How about a quickie? <br>@@ @@.mc-speech; No! I have [[to go|LibraryInside]]@@<br> <</linkappend>>@@ <</if>> <</if>>
<<image "ui/img/library-inside.jpg" { width: "100%" }>> <br> <<if setup.Library.hasEnergyToSearch()>> @@.usebtn; [[Search for information about ghosts in books|LibrarySearchResult][setup.Library.spendEnergyToSearch()]] @@<<statIcon setup.StatIcon.ENERGY>> <<else>>@@.mc-thoughts; I'm too tired@@ <span><<statIcon setup.StatIcon.ENERGY true>></span> <</if>> <br> <<if hasVisited("Comics")>> @@.enterbtn; [[Read porn comics|Comics]]@@<br> <</if>> <<if setup.Library.hasFoundTipsBook()>> @@.enterbtn; [[Read "A Brief Guide to Ghost Hunting"|LibraryTipsBook]]@@<br> <</if>> <<if setup.Library.hasFoundAnyTornPage()>> @@.enterbtn; [[Read recovered torn pages|LibraryTornPagesCollected]]@@<br> <</if>> <<if setup.Library.hasFoundBrook()>> @@.enterbtn; [[Find Brook|LibraryBrook]]@@<br> <</if>> <br> @@.backbtn; [[Leave|Library]]@@<br>
<<set _foundLibrary to setup.Library.availableSearchResults()>> <<set _selectedResult to _foundLibrary[random(0, _foundLibrary.length - 1)]>> <<if _selectedResult is "book">> <<include "LibraryTipsBook">> <<run setup.Library.markTipsBookFound()>> <<elseif _selectedResult is "Comics">> <<run setup.Library.markComicsFound()>> <<image "scenes/library/comics-found.jpg" { width: "100%" }>><br> @@.mc-speech; What's this? Erotic comics? It looks interesting... I wonder how it ended up here.@@<br> @@.enterbtn;[[Read comics|Comics]]<br>@@ <br> <<elseif _selectedResult is "girl">> <<include "LibraryGirl">> <<elseif _selectedResult is "guy">> <<include "LibraryGuy">> <<elseif _selectedResult is "brook">> <<include "LibraryBrook">> <<run setup.Library.markBrookFound()>> <<elseif _selectedResult is "desecratedBook">> <<include "LibraryDesecratedBook">> <<elseif _selectedResult is "tornPage">> <<include "LibraryTornPage">> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<image "scenes/library/book.jpg" "libraryCenteredImg">><br> @@.mc-thoughts;You pull out a book titled "A Brief Guide to Ghost Hunting".@@ <br> <<run setup.Library.markTipsBookFound()>> <<set _check to random(1,3)>> <<if _check eq 1>> Favorite Room<br> Every ghost has a favorite room. Only in this room you can find evidence such as: High Temperature, Ghost Writing, Ectoplasm, and Spiritbox.<br> <</if>> <<if _check eq 2>> Temperature<br> A simple way to find the "favorite room" or evidence of "Increased Temperature" is to use a thermometer. If the temperature is between 13 and 16°C, it is a normal room with no ghost presence. If the temperature is between 16 and 21°C, it is a "favorite room" of the ghost, but without the evidence of "High Temperature." If the temperature ranges from 19 to 24°C, it is the "favorite room" with evidence of "High Temperature."<br> <</if>> <<if _check eq 3>> Hunting<br> Every ghost has the ability to start a hunt. Depending on the type of ghost, the hunt may begin either if your sanity is below 50, or if your lust is above 50.<br> <</if>> <br> @@.backbtn; [[Leave|LibraryInside]]@@ <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<set _found to setup.Library.pickRandomTornPage()>> <<if _found is null>> @@.mc-thoughts; You search the stacks again, but you've already collected every page that was hidden here.@@<br> <<else>> @@.mc-thoughts; A folded scrap of paper is wedged behind the spine of a book that doesn't belong on this shelf. The handwriting matches the desecrated field guide.@@<br> <<image "scenes/library/torn-page.png" "libraryCenteredImg">><br> <br> ''<<= _found.tip.title>>''<br> <<= _found.tip.body>><br> <</if>> <br> @@.backbtn; [[Leave|LibraryInside]]@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
@@.mc-thoughts; You smooth out the pages you've recovered so far and look them over again.@@<br> <<image "scenes/library/torn-page.png" "libraryCenteredImg">><br> <br> <<set _picked to setup.Library.randomCollectedTornPage()>> <<if _picked is null>> @@.mc-thoughts; ...nothing yet. The pages must still be tucked somewhere on the shelves.@@<br> <<else>> ''<<= _picked.tip.title>>''<br> <<= _picked.tip.body>><br> <br> @@.mc-thoughts; (<<= setup.Library.tornPagesFound().length>> of <<= setup.Library.tornPageTips().length>> pages recovered.)@@<br> <</if>> <br> @@.backbtn; [[Leave|LibraryInside]]@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<set _comic to setup.Library.activeComic()>> <<if _comic>> <<run setup.Library.resetComics()>> <<comicSlider _comic.prefix _comic.count>> <</if>> <<addclass "body" "style-read-comics">> <script> var slideIndex = 0; function showSlides() { const slides = document.getElementsByClassName("slide"); if (slides.length === 0) { return; } for (let i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } slideIndex++; if (slideIndex > slides.length) {slideIndex = 1} slides[slideIndex-1].style.display = "block"; } function plusSlides(n) { const slides = document.getElementsByClassName("slide"); slideIndex += n; if (slideIndex > slides.length) {slideIndex = 1} if (slideIndex < 1) {slideIndex = slides.length} for (let i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } slides[slideIndex-1].style.display = "block"; } showSlides(); </script> <br> <<addLust 30>> + 30 <<statIcon setup.StatIcon.HEALTH>><br> <br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> @@.backbtn; [[Back|Comics]] @@
<<widget "disableLinks">> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <</widget>> /* comicSlider -- args: pathPrefix, count. Renders the slide-container that ReadComics steps through. Each page's asset is pathPrefix + 3-digit zero-padded index + .jpg (so page 7 of a comic with prefix X is X007.jpg). The first slide is marked .active; prev/next anchors hook into the showSlides / plusSlides script in ReadComics. */ <<widget "comicSlider">> <<set _prefix to _args[0]>> <<set _count to _args[1]>> <div class="slide-container"> <<for _i to 1; _i lte _count; _i++>> <<set _cls to _i eq 1 ? "slide active" : "slide">> <<set _src to _prefix + _i.toString().padStart(3, "0") + ".jpg">> <div @class="_cls"> <<image _src { style: "width:100%", alt: "Image " + _i }>> </div> <</for>> <a class="prev" onclick="plusSlides(-1)">❮</a> <a class="next" onclick="plusSlides(1)">❯</a> </div> <</widget>>
<<image "ui/img/adult-section.jpeg" { width: "100%" }>> @@.mc-thoughts; The shelves are stocked with all sorts of items -- from classic toys to those clearly meant for more experienced buyers. It's quite cozy in here.@@<br> @@.enterbtn; [[Ask the adult shop assistant|AdultSectionBlake]]@@<br> @@.enterbtn; [[Buy something|AdultSectionPurchase]]@@<br> <br> @@.backbtn; [[Leave|Mall]]@@<br>
<<image "characters/blake/blake-shop.jpg" { class: "displayCentredImgs", width: "50%" }>><br> <<if setup.Mall.blakeUnlocked()>> <<if setup.Mall.blakeFirstMeeting()>> @@.notmc-speech; Hey, you're not <<= setup.Mc.name()>> by any chance, are you? Alice told me you went ghost hunting together.@@<br> @@.mc-speech;Yeah, that's right.@@<br> <<run setup.Mall.setBlakeDialogStage(0)>> <<if setup.Mall.blakeCanIntroduceCursedItemBuyback()>> @@.notmc-speech;Alice mentioned that sometimes you come across... hmm, let's say, "something special." Some toys with, well, "a magical aura"?@@<br> @@.mc-speech;Yeah, you're right. But I usually give them to the witch in exchange for a fee.@@<br> @@.notmc-speech;How about selling them to me instead? I'll pay you more than the witch@@<br> @@.mc-speech;Why do you need them?@@<br> @@.notmc-speech;Well, you know, these toys aren't exactly ordinary, and I could sell them as exclusives. My shop is known for unique items, so they'll definitely find their buyer.@@<br> @@.mc-speech;Hmm... I'll think about it.@@<br> <br> @@.mc-action;Now you can bring cursed items to the adult store and sell them for a higher price.@@<br> <<run setup.Mall.setBlakeDialogStage(1)>> <<else>> @@.notmc-speech;Wow! It's amazing that you're into this stuff. Good luck!@@<br> <</if>> <<else>> @@.notmc-speech; Hi <<= setup.Mc.name()>>, need any help?@@<br> <<if setup.Mall.blakeHasCursedItemToSell()>> <<linkreplace "@@.usebtn;Give her the cursed item@@">> @@.notmc-speech; Wow, thanks. Here's your money. Feel free to bring more, I'll gladly buy them from you.@@<br> Money: +60 $ <br> <<if setup.Mall.canRaiseBlakeRelationship()>> <<run setup.Mall.raiseBlakeRelationship()>> @@.mc-speech; Relationship with Blake increased: now <<= setup.Mall.blakeRelationship()>>!@@ <</if>> <<run setup.Mall.sellCursedItemToBlake()>> <</linkreplace>> <<else>> <</if>> <<if setup.Mall.blakeCanIntroduceCursedItemBuyback()>> @@.notmc-speech;Alice mentioned that sometimes you come across... hmm, let's say, "something special." Some toys with, well, "a magical aura"?@@<br> @@.mc-speech;Yeah, you're right. But I usually give them to the witch in exchange for a fee.@@<br> @@.notmc-speech;How about selling them to me instead? I'll pay you more than the witch@@<br> @@.mc-speech;Why do you need them?@@<br> @@.notmc-speech;Well, you know, these toys aren't exactly ordinary, and I could sell them as exclusives. My shop is known for unique items, so they'll definitely find their buyer.@@<br> @@.mc-speech;Hmm... I'll think about it.@@<br> <br> @@.mc-action;Now you can bring cursed items to the adult store and sell them for a higher price.@@<br> <<run setup.Mall.setBlakeDialogStage(1)>> <</if>> <</if>> <<else>> @@.notmc-speech; Hi ,need any help?@@<br> @@.mc-speech; No, thanks, I'm just looking around.@@<br> <</if>> <<if setup.Mall.blakeIsCompanionCandidate()>> <<if setup.Mall.blakeHuntFinishedAlone()>> @@.mc-speech; [[Ask her how her ghost hunt went.|BlakeHuntEndAlone]]@@<br> <<else>> @@.mc-speech;<<link "Ask Blake to join you for ghost hunting tonight.">> <<run setup.Mall.pickBlakeForHunt()>> <<replace "#blakeInfoAnswer">>@@.mc-speech; I want you to join me for ghost hunting today@@<br> @@.notmc-speech; Yes, of course. I'll be ready. Let's meet by the entrance to the haunted house. <br> But if we find the cursed item, I'll keep it, okay?@@<br> @@.mc-speech; Fine, let's do that.@@ <</replace>> <</link>>@@<br> <span class="CompanionInfoAskForHuntAlone"> @@.mc-speech;<<link "I'd like you to go ghost hunting alone.">> <<replace "#blakeInfoAnswer">>@@.notmc-speech; I think I'm already experienced enough to do it on my own. Where should I go?@@<br> @@.enterbtn;<<link `"Owaissa Street - " + setup.Mall.chanceBlakeAloneOwaissa() + " %"`>> <<run setup.Mall.pickBlakeForSoloHuntOwaissa()>> <<if setup.Mc.money() lt 20>> <<replace "#blakeInfoAnswerTwo">>@@.warningtext; I don't have enough money to buy her a contract @@ <</replace>> <<else>> <<replace "#blakeInfoAnswerTwo">>@@.notmc-speech;Owaissa Street? Hmm... Yes, of course. I think I can handle it.@@ <</replace>> <</if>> <</link>>@@ @@.enterbtn;<<link `"Elm Street - " + setup.Mall.chanceBlakeAloneElm() + " %"`>> <<run setup.Mall.pickBlakeForSoloHuntElm()>> <<if setup.Mc.money() lt 20>> <<replace "#blakeInfoAnswerTwo">>@@.warningtext; I don't have enough money to buy her a contract @@ <</replace>> <<else>> <<replace "#blakeInfoAnswerTwo">>@@.notmc-speech;Elm Street? Hmm... Yes, of course. I think I can handle it.@@ <</replace>> <</if>> <</link>>@@@@color: green; <b>-20$</b>@@<br> <span id="blakeInfoAnswerTwo"> </span> <</replace>> <</link>>@@<<if setup.Companion.companionLvl('Blake') lt 2>> @@.warningtext; Req. Blake's lvl 2+@@ <</if>></span> <br> <span id="blakeInfoAnswer"> </span> <</if>> <br> <<if setup.Companion.companionLvl('Blake') lt 2>> <<done>> <<addclass ".CompanionInfoAskForHuntAlone" "disabled-link">> <</done>> <</if>> <</if>> <br> <br> @@.backbtn; [[Back|AdultSection]]@@
<div class="flexwrapper backgroundForText"> <<shopCardCorruption "dildoPurchased" "ui/img/dildo.jpg" 30 "AdultSectionPurchase" 3 1>> <div class="housecard"> <<if setup.Mall.canBuyWardenOutfit()>> <<image "outfits/wardrobe/warden.webp" "iconPx">><br> <span class="priceAmount">500$</span><br> <<if setup.Mall.meetsCorruptionForWarden()>> <<if setup.Mc.money() gte 500>> @@.buyItemLink;<<link "Buy" "AdultSectionPurchase">> <<run setup.Mall.buyWardenOutfit()>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <<else>> @@.mc-thoughts; I don't think I can wear this...@@@@.warningtext; (Req. <<image "ui/img/corruption.png" { style: "position: relative; top: 0.375em; width:20%; display: inline; margin: 0;" }>> ≥ 3)@@ <</if>> <</if>> </div> <div class="housecard"> </div> </div> <br> @@.backbtn;[[Leave|AdultSection]] @@<br> <<bodyBackground "assets/ui/img/adult-section.jpeg">>
<div class="flexwrapper backgroundForText"> <<shopCard "jeansState1" "outfits/wardrobe/jeans1.png" 30 "ClothingSection" "+5 beauty">> <<shopCard "jeansState2" "outfits/wardrobe/jeans2.png" 40 "ClothingSection" "+8 beauty">> <<shopCard "jeansState3" "outfits/wardrobe/jeans3.png" 50 "ClothingSection" "+11 beauty">> <<shopCard "shortsState1" "outfits/wardrobe/shorts1.png" 35 "ClothingSection" "+6 beauty">> <<shopCard "shortsState2" "outfits/wardrobe/shorts2.png" 45 "ClothingSection" "+9 beauty">> <<shopCard "shortsState3" "outfits/wardrobe/shorts3.png" 55 "ClothingSection" "+12 beauty">> <<shopCard "skirtState1" "outfits/wardrobe/skirt1.png" 40 "ClothingSection" "+7 beauty">> <<shopCard "skirtState2" "outfits/wardrobe/skirt2.png" 50 "ClothingSection" "+10 beauty">> <<shopCard "skirtState3" "outfits/wardrobe/skirt3.png" 60 "ClothingSection" "+13 beauty">> <<shopCard "tshirtState1" "outfits/wardrobe/tshirt1.png" 30 "ClothingSection" "+5 beauty">> <<shopCard "tshirtState2" "outfits/wardrobe/tshirt2.png" 40 "ClothingSection" "+8 beauty">> <<shopCard "tshirtState3" "outfits/wardrobe/tshirt3.png" 50 "ClothingSection" "+11 beauty">> <<shopCard "braState1" "outfits/wardrobe/slip2.png" 20 "ClothingSection" "+2 beauty">> <<shopCard "braState2" "outfits/wardrobe/slip3.png" 30 "ClothingSection" "+4 beauty">> <<shopCard "braState3" "outfits/wardrobe/slip4.png" 40 "ClothingSection" "+6 beauty">> <<shopCard "pantiesState1" "outfits/wardrobe/short2.png" 25 "ClothingSection" "+2 beauty">> <<shopCard "pantiesState2" "outfits/wardrobe/short3.png" 35 "ClothingSection" "+4 beauty">> <<shopCard "pantiesState3" "outfits/wardrobe/short4.png" 45 "ClothingSection" "+6 beauty">> <<shopCard "stockingsState1" "outfits/wardrobe/stockings1.png" 30 "ClothingSection" "+2 beauty">> <<shopCard "stockingsState2" "outfits/wardrobe/stockings2.png" 60 "ClothingSection" "+4 beauty">> <<shopCard "stockingsState3" "outfits/wardrobe/stockings3.png" 120 "ClothingSection" "+6 beauty">> <div class="housecard"> </div> <<shopCard "sportswear" "outfits/wardrobe/sportswear.jpg" 100 "ClothingSection">> <div> </div> <div> </div> <div class="housecard"> </div> <div class="housecard"> <<if setup.Mc.corruption() gte 2>> <<shopCard "neckChokerState1" "outfits/wardrobe/neck-choker1.png" 100 "ClothingSection" "+15 lust">> <</if>> </div> </div> <br> @@.backbtn;[[Leave|Mall]] @@ <<bodyBackground "assets/ui/img/clothing-section.jpg">>
<<nobr>> <div class="flexwrapper backgroundForText"> <<shopCardConditional `setup.Mall.canBuyCamera()` "isCameraBought" "ui/img/webcamera.png" 100 "ElectronicsSection" 1>> <<shopCard "isPhoneBought" "ui/img/phone.png" 200 "ElectronicsSection" "" 1>> <div class="housecard"> </div> </div> <br> @@.backbtn;[[Leave|Mall]] @@<br> <</nobr>> <<bodyBackground "assets/ui/img/electronics-section.jpg">>
<<nobr>> <div class="flexwrapper backgroundForText"> <<consumableCard "energyDrinkAmount" "ui/img/energy-drink.png" 5 "GeneralSection" 1 "You have {n} energy drinks">> <<consumableCard "makeupAmount" "ui/img/cosmetics.png" 10 "GeneralSection" 10 "You have {n} makeup charges left">> <<consumableCard "medicineAmount" "ui/img/medicine.png" 30 "GeneralSection" 1 "You have {n} pill(s) remaining">> <div class="housecard"> <<image "ui/img/spray.png" "iconPx">><br> <<if setup.Mall.needsPepperSpray()>> <span class="priceAmount">10$</span><br> <<if setup.Mc.money() gte 10>> @@.buyItemLink;<<link "Buy" "GeneralSection">> <<run setup.Mall.buyPepperSpray()>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <<else>>@@.mc-thoughts;I already have pepper spray (<<= setup.Mall.pepperSprayCharges()>> charges left)@@ <</if>> </div> </div> <br> @@.backbtn;[[Leave|Mall]] @@<br> <</nobr>> <<bodyBackground "assets/ui/img/general-section.jpg">>
<<image "ui/img/mall.jpg" { width: "100%" }>> @@.location; Mall@@<br> @@.mc-thoughts; This mall is a fantastic place for purchases. I believe I won't find any items related to my profession here, but there's plenty of everything else. @@<br> <br> <<if not setup.Mall.isOpen()>> @@.mc-thoughts;The mall is not open right now (open from 8 AM to 10 PM)@@ <<else>> @@.enterbtn;[[Clothing section|ClothingSection]]@@<br> @@.enterbtn;[[General merchandise|GeneralSection]]@@<br> @@.enterbtn;[[Electronics section|ElectronicsSection]]@@<br> @@.enterbtn;[[Adult section|AdultSection]]@@<br> <</if>> <br> <br> @@.backbtn;[[Leave|CityMap]]@@<br> <<if previous(2) is "Mall">><<addTime 0.5>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 0.5>> <</if>>
<<script>> setup.notPurchased = function(varName) { var val = State.variables[varName]; return val === undefined || val === setup.ClothingState.NOT_BOUGHT || val === 0; }; <</script>> <<widget "consumableCard">> <<set _varName to _args[0]>> <<set _img to _args[1]>> <<set _price to _args[2]>> <<set _returnPassage to _args[3]>> <<set _delta to _args[4]>> <<set _ownedText to _args[5]>> <div class="housecard"> <<image _img "iconPx">><br> <span class="priceAmount"><<= _price>>$</span><br> <<if setup.Mc.money() gte _price>> <<capture _varName, _price, _delta, _returnPassage>> @@.buyItemLink;<<link "Buy" _returnPassage>> <<run State.variables[_varName] = (State.variables[_varName] || 0) + _delta>> <<run setup.Mc.removeMoney(_price)>> <</link>>@@<br> <</capture>> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <span class="subtitleAmount">@@.mc-thoughts; <<= _ownedText.replace("{n}", State.variables[_varName] || 0)>>@@</span> </div> <</widget>> <<widget "shopCard">> <<set _varName to _args[0]>> <<set _img to _args[1]>> <<set _price to _args[2]>> <<set _returnPassage to _args[3]>> <<set _bonus to _args[4]>> <<set _boughtValue to (typeof _args[5] !== "undefined") ? _args[5] : setup.ClothingState.NOT_WORN>> <div class="housecard"> <<if setup.notPurchased(_varName)>> <<image _img "iconPx">><br> <<if _bonus>><span class="mc-thoughts">_bonus</span><br> <</if>> <span class="priceAmount"><<= _price>>$</span><br> <<if setup.Mc.money() gte _price>> <<capture _varName, _price, _boughtValue, _returnPassage>> @@.buyItemLink;<<link "Buy" _returnPassage>> <<run State.variables[_varName] = _boughtValue>> <<run setup.Mc.removeMoney(_price)>> <</link>>@@<br> <</capture>> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <</widget>> <<widget "shopCardCorruption">> <<set _varName to _args[0]>> <<set _img to _args[1]>> <<set _price to _args[2]>> <<set _returnPassage to _args[3]>> <<set _reqCorruption to _args[4]>> <<set _boughtValue to (typeof _args[5] !== "undefined") ? _args[5] : 1>> <<set _noNeedText to (typeof _args[6] !== "undefined") ? _args[6] : "Don't think I need it">> <div class="housecard"> <<if setup.notPurchased(_varName)>> <<image _img "iconPx">><br> <span class="priceAmount"><<= _price>>$</span><br> <<if setup.Mc.corruption() gte _reqCorruption>> <<if setup.Mc.money() gte _price>> <<capture _varName, _price, _boughtValue, _returnPassage>> @@.buyItemLink;<<link "Buy" _returnPassage>> <<run State.variables[_varName] = _boughtValue>> <<run setup.Mc.removeMoney(_price)>> <</link>>@@<br> <</capture>> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <<else>>@@.mc-thoughts; _noNeedText@@@@.warningtext; (Req. <<image "ui/img/corruption.png" { style: "position: relative; top: 0.375em; width:20%; display: inline; margin: 0;" }>> ≥ _reqCorruption)@@ <</if>> <</if>> </div> <</widget>> <<widget "shopCardConditional">> <<set _condition to _args[0]>> <<set _varName to _args[1]>> <<set _img to _args[2]>> <<set _price to _args[3]>> <<set _returnPassage to _args[4]>> <<set _boughtValue to (typeof _args[5] !== "undefined") ? _args[5] : 1>> <div class="housecard"> <<if _condition>> <<if setup.notPurchased(_varName)>> <<image _img "iconPx">><br> <span class="priceAmount"><<= _price>>$</span><br> <<if setup.Mc.money() gte _price>> <<capture _varName, _price, _boughtValue, _returnPassage>> @@.buyItemLink;<<link "Buy" _returnPassage>> <<run State.variables[_varName] = _boughtValue>> <<run setup.Mc.removeMoney(_price)>> <</link>>@@<br> <</capture>> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <<else>> @@.mc-thoughts; I don't think I need to buy anything here right now@@ <</if>> <</if>> </div> <</widget>>
<<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/rescue/ash/1.0.mp4">> @@.mc-thoughts; You slowly start to regain consciousness. Your head hurts, and on top of that, someone is licking you@@<br> @@.mc-speech; It's Ash! Ah~ that hurts~@@<br> @@.notmc-speech;You're my toy for today. If you're a good slut, I'll let you go.@@<br> @@.mc-speech; Oh no, what have I done~@@<br> @@.mc-thoughts; You have no strength left to try to escape, so you decide@@ <<linkappend "@@.usebtn; to submit.@@">> <<video "characters/rescue/ash/1.1.mp4">> @@.mc-speech; Ohhhhh fuck~ My pussy! You finger it too hard.@@<br> @@.mc-thoughts; She took out a strapon and started @@ <<linkappend "@@.mc-thoughtsLink; fucking your mouth with it.@@">> <<video "characters/rescue/ash/1.2.mp4">> @@.mc-speech; Uhhng~ Glp Gulp~@@<br> @@.notmc-speech; Now your ass, fast!@@<br> @@.mc-thoughts; You understand that if you don't submit to her, it will hurt more, so you give your [[asshole|RescueAshPossessed1]] to her.@@<br> <</linkappend>> <</linkappend>> <<elseif _check eq 2>> <<video "characters/rescue/ash/2.0.mp4">> @@.mc-thoughts; You slowly start to regain consciousness. Your head hurts, and on top of that, someone is licking you@@<br> @@.mc-speech; Mm~ what are you doing...@@<br> @@.mc-thoughts; But she didn't answer. She started playing with your ass, @@<<linkappend "@@.usebtn; spanking it@@">> <<video "characters/rescue/ash/2.1.mp4">> @@.notmc-speech; I think you'll join us today.@@<br> @@.mc-speech; Wha... What?@@<br> @@.mc-thoughts; She threw you on the bed, where another girl was already waiting.@@<br> @@.mc-speech; Wha... what do you [[want from me...|RescueAshPossessed2]]@@<br> <</linkappend>> <</if>>
<span id="rescueAshPossessed1"> <<video "characters/rescue/ash/1.3.mp4">></span> @@.mc-thoughts; She keeps fucking you@@ <<link "@@.usebtn; for a while.@@">> <<replace "#rescueAshPossessed1">> <<videoToggle "characters/rescue/ash/1.4.mp4" "characters/rescue/ash/1.3.mp4">> <</replace>> <</link>> @@.mc-speech; Nooo this is not right...~ But feels sooo good~@@<br> @@.mc-thoughts; Then she grabs your hair and makes you@@ <<linkappend "@@.usebtn; lick her pussy.@@">> <<video "characters/rescue/ash/1.5.mp4">> @@.notmc-speech; Now I want to cum, use your tongue, slut@@<br> @@.mc-thoughts; After playing with your body, @@ <<linkappend "@@.usebtn; she lets you go@@">> <<video "characters/rescue/ash/1.6.mp4">> @@.notmc-speech; You are free, but next time you might not be so lucky@@<br> @@.mc-thoughts; She kisses you again, and everything goes black.@@<br> <br> @@.backbtn; [[Wake up|Church][setup.MissingWomen.sleepOffHoursAfterEvent()]]@@<br> <</linkappend>> <</linkappend>>
<span id="rescueAshPossessed2"> <<video "characters/rescue/ash/2.2.mp4">></span> @@.mc-thoughts; They both started fucking you with strapons, @@ <<link "@@.usebtn; penetrating every hole of yours.@@">> <<replace "#rescueAshPossessed2">> <<videoToggle "characters/rescue/ash/2.3.mp4" "characters/rescue/ash/2.2.mp4">> <</replace>> <</link>> @@.mc-speech; This is so nasty...@@<br> @@.mc-thoughts; Having played with your body, they hugged you and @@<<linkappend "@@.usebtn; started kissing@@">> <<video "characters/rescue/ash/2.4.mp4">> @@.notmc-speech; We'll let you go, this time. Maybe next time your ass won't be so lucky.@@<br> @@.mc-thoughts; They kiss you again, and everything goes black.@@<br><br> @@.backbtn; [[Wake up|Church][setup.MissingWomen.sleepOffHoursAfterEvent()]]@@<br> <</linkappend>>
@@.mc-thoughts; You notice someone's EMF reader. Next to it, there's a small torn piece of a photo.<br> Your EMF reader spikes the moment you bring it close to the @@<<linkappend "@@.usebtn;fragment of the old photo.@@">> <<run setup.MissingWomen.setRescueClueFound()>> <<image 'characters/rescue/house/' + setup.MissingWomen.randomRescuePhotoNumber() + '.jpg' { class: setup.MissingWomen.tornStyleRandom() + ' displayCentredImgs', width: "50%" }>> <br>@@.mc-speech; Hmm, this place looks familiar... but I can't quite remember where I've seen it.<br> Clearly, this photo is somehow connected to the ghost and the missing girl.@@<br> <br> @@.mc-action; You found a piece of an old photo.@@<br><br> <<if setup.MissingWomen.emfLevel() neq 3>><<run setup.MissingWomen.upgradeEmfToLvl3()>> @@.mc-action; You picked up an EMF reader <<statIcon setup.StatIcon.EMF>> (Level 3).@@ <</if>> <br><br> @@.backbtn; [[Continue|$return]]@@ <</linkappend>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<if setup.MissingWomen.rescueEventOutcome() eq "success">> <<include "RescueSuccess">> <<else>> <<include "RescuePossessed">> <</if>> <<run setup.MissingWomen.startRescueBoardCooldown()>>
<div style="position: relative;"> <<image setup.MissingWomen.rescueHouseImage(setup.MissingWomen.randomRescuePhotoNumber()) { class: setup.MissingWomen.tornStyleRandom() + ' hideRescueHouse', id: "rescueHouseHidden", width: "100%", style: "position: absolute; z-index: 10;" }>> <<image setup.MissingWomen.rescueHouseImage(setup.MissingWomen.rescueHouse()) { width: "100%" }>> </div> <<if setup.MissingWomen.hasRescueClue()>> <<linkreplace "@@.usebtn;Compare the house with the photo@@">> <<removeclass "#rescueHouseHidden" "hideRescueHouse">> <<if setup.MissingWomen.isCorrectHouse()>> @@.mc-speech; It seems like this is the house.@@ <<else>> @@.mc-speech; No, doesn't really look like it.@@ <</if>> <</linkreplace>><br> <</if>> <<addTime 20>> <<if setup.MissingWomen.searchTooLate()>> @@.mc-speech; The nun said that after 6 p.m. it's pointless to keep searching. It seems I'm too late. I should go back to her and tell her I failed.@@<br> <<else>> <<if setup.MissingWomen.canSearchHouse()>> <<linkreplace '@@.usebtn; Search the house @@ <<statIcon setup.StatIcon.ENERGY>>'>> <<run setup.Mc.addEnergy(-1)>> <<if not setup.MissingWomen.isCorrectHouse()>> @@.mc-thoughts; You search the house for 30 minutes, but find no one.@@ <<addTime 30>> <<elseif setup.MissingWomen.canResolveRescue()>> <<goto "RescueEvent">> <<elseif setup.MissingWomen.questFailed()>> @@.mc-speech; The nun said that after 6 p.m. it's pointless to keep searching. It seems I'm too late. I should go back to her and tell her I failed.@@<br> <<else>> @@.mc-thoughts; You search around but can't find anything yet. Maybe you should come back later.@@ <</if>> <</linkreplace>> <<else>> @@.mc-speech;I'm too tired to search the house.@@<br> <</if>> <</if>><br> <br> @@.backbtn;[[Back|RescueMap]]@@<br>
<<set _check to random(1,3)>> <<if _check eq 1>> <<video "characters/rescue/jade/1.0.mp4">> <</if>> <<if _check eq 2>><<video "characters/rescue/jade/2.0.mp4">> <</if>> <<if _check eq 3>> <<image "characters/rescue/jade/3.0.jpg" { width: "100%" }>> <</if>> @@.mc-thoughts; You slowly regain consciousness, your head throbbing with pain, and the first thing you feel is the tight ropes binding your wrists. You try to move, but your hands and legs are tied up. Flashes of memory come back to you: you came here to save <<= setup.MissingWomen.currentRescueGirl()>>. But something went wrong. <br> You sense someone nearby. A wave of anxiety builds in your chest. Suddenly, you hear a voice@@<br> @@.notmc-speech; Well, well, baby, you're finally awake?@@<br> @@.mc-speech; <<= setup.MissingWomen.currentRescueGirl()>>? What the hell is going on?!@@<br> @@.mc-thoughts; She laughs, but there's something off about it, something eerie that makes you tense up.<br> You realize it's not Jade anymore. Whoever's standing in front of you, it's not <<= setup.MissingWomen.currentRescueGirl()>>.@@<br> @@.mc-speech; Hey, let me go! Whatever you are, just let me go!@@<br> @@.mc-thoughts; She leans in closer, her breath brushing against your skin. Her voice drops, almost whispering @@<br> @@.notmc-speech; Of course, I'll let you go... but not before we <<linkappend "have a little fun first. ">> <<if _check eq 1>> <<video "characters/rescue/jade/1.1.mp4">> @@.mc-thoughts; She started to rub your pussy at a furious pace. Your moans began to spread throughout the house, but she didn't show you any mercy.@@<br> @@.mc-speech; OH~ Fuck~ I'm going to...@@<br> @@.mc-thoughts; She latched onto your pussy and began to greedily [[suck on your clit.|RescueJadePossessed1][setup.MissingWomen.jadePossessedStage() to 1]]@@<br> <</if>> <<if _check eq 2>> <<set _checkR to random(1,2)>> <<if _checkR eq 1>> <<video "characters/rescue/jade/2.1.mp4">> <</if>> <<if _checkR eq 2>> <<video "characters/rescue/jade/2.2.mp4">> <</if>> @@.notmc-speech; Oh~ we're going to have so much fun together.@@<br> @@.mc-thoughts; With those words, she started touching your body greedily, sending small shivers through you every time she touched your sensitive spots.@@<br> @@.mc-speech; No, don't touch me, ah~@@<br> @@.notmc-speech; I can see you're starting to enjoy this. Haha, [[what if I just...|RescueJadePossessed1][setup.MissingWomen.jadePossessedStage() to 2]]@@<br> <</if>> <<if _check eq 3>> <<set _checkR to random(1,3)>> <<if _checkR eq 1>> <<video "characters/rescue/jade/3.1.mp4">> <</if>> <<if _checkR eq 2>> <<video "characters/rescue/jade/3.2.mp4">> <</if>> <<if _checkR eq 3>> <<video "characters/rescue/jade/3.3.mp4">> <</if>> @@.notmc-speech; Oh~ we're going to have so much fun together.@@<br> @@.mc-thoughts; With those words, she started touching your body greedily, sending small shivers through you every time she touched your sensitive spots.@@<br> @@.mc-speech; No, don't touch me, ah~@@<br> @@.notmc-speech; I can see you're starting to enjoy this. Haha, [[what if I just...|RescueJadePossessed1][setup.MissingWomen.jadePossessedStage() to 3]]@@<br> <</if>> <</linkappend>>@@
<<if setup.MissingWomen.jadePossessedStage() eq 1>> <<video "characters/rescue/jade/1.2.mp4">> @@.mc-thoughts; She started to lick your pussy at a furious pace. Your moans began to spread throughout the house, but she didn't show you any mercy.@@<br> @@.mc-speech; OH~ Fuck~ I'm going to...@@<br> @@.mc-thoughts; A powerful orgasm shakes your body. As you bask in the waves of pleasure coursing through you, she started putting something on, but you couldn't see <<linkappend "what it was">> <<video "characters/rescue/jade/1.3.mp4">> @@.mc-thoughts; She positioned you on your knees and brought something hard to your pussy.@@<br> @@.mc-speech; Wha~what is that...@@<br> @@.notmc-speech; Get ready to find out...@@<br> @@.mc-thoughts; She easily slid the huge dildo into your dripping pussy and began to [[fuck you.|RescueJadePossessed2]]@@<br> <</linkappend>>@@ <<elseif setup.MissingWomen.jadePossessedStage() eq 2>> <<set _checkR to random(1,2)>> <<if _checkR eq 1>> <<video "characters/rescue/jade/2.3.mp4">> <</if>> <<if _checkR eq 2>> <<video "characters/rescue/jade/2.4.mp4">> <</if>> @@.mc-thoughts; She started to rub your pussy at a furious pace. Your moans began to spread throughout the house, but she didn't show you any mercy.@@<br> @@.mc-speech; OH~ Fuck~ I'm going to...@@<br> @@.notmc-speech; Haha~ Slow down, I have <<linkappend "a surprise for you.">> <<video "characters/rescue/jade/2.5.mp4">> @@.mc-thoughts; She grabbed the vibrator and pressed it against your dripping pussy, causing your vision to darken and and uncontrollable moans to slip from your mouth@@<br> @@.notmc-speech; Yes, good girl, [[come to me.|RescueJadePossessed2]]@@<br> <</linkappend>>@@ <<elseif setup.MissingWomen.jadePossessedStage() eq 3>> <<set _checkR to random(1,2)>> <<if _checkR eq 1>> <<video "characters/rescue/jade/3.4.mp4">> <</if>> <<if _checkR eq 2>> <<video "characters/rescue/jade/3.5.mp4">> <</if>> @@.mc-thoughts; She started to rub your pussy at a furious pace. Your moans began to spread throughout the house, but she didn't show you any mercy.@@<br> @@.mc-speech; OH~ Fuck~ I'm going to...@@<br> @@.mc-thoughts; A powerful orgasm hit you, causing your knees to buckle, and you fell to the floor. She waited until you caught your breath a bit. @@<br> @@.notmc-speech; I like you better in this position.<br> Come on, slut, make your friend <<linkappend "feel good">> <<set _checkR to random(1,2)>> <<if _checkR eq 1>> <<video "characters/rescue/jade/3.6.mp4">> <</if>> <<if _checkR eq 2>> <<video "characters/rescue/jade/3.7.mp4">> <</if>> @@.mc-thoughts; You started licking her hot pussy. Her juices were spreading all over your face.@@<br> @@.mc-speech; Oh, she's so horny...@@<br> @@.notmc-speech; Mm~ okay, that's enough for this bitch, I've got other entertainment for her. @@<br> @@.mc-thoughts; [[She pulled you up.|RescueJadePossessed2]]@@<br> <</linkappend>>@@ <</if>>
<<if setup.MissingWomen.jadePossessedStage() eq 1>> <<set _checkR to random(1,2)>> <<if _checkR eq 1>> <<video "characters/rescue/jade/1.4.mp4">> <</if>> <<if _checkR eq 2>> <<video "characters/rescue/jade/1.5.mp4">> <</if>> @@.mc-thoughts; She started fucking you fast, making your pussy make slurping sounds@@<br> @@.mc-speech; Oh my god~ I'm going to <<linkappend "cum again~">> <<video "characters/rescue/jade/1.6.mp4">> @@.mc-thoughts; The orgasm hit you again, and you couldn't hold on. Falling to the floor, your body was still trembling in pleasure.@@<br> @@.notmc-speech; Well, I think you've had enough, you can [[leave|Church]] if you can get up, haha@@<br> <</linkappend>>@@ <<elseif setup.MissingWomen.jadePossessedStage() eq 2>> <<video "characters/rescue/jade/2.6.mp4">> @@.mc-thoughts; You start kissing, and the whole world slips away from you in that moment. <br>You [[pass out.|Church]]@@ <<elseif setup.MissingWomen.jadePossessedStage() eq 3>> <<video "characters/rescue/jade/3.8.mp4">> @@.mc-thoughts; You start kissing, and the whole world slips away from you in that moment. <br>You [[pass out.|Church][setup.MissingWomen.sleepOffHoursAfterEvent()]]@@ <</if>>
<<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/rescue/julia/1.0.mp4">> @@.mc-thoughts; As soon as you got close to her, she wrapped her arms around you and started touching your ass.@@<br> @@.mc-speech; Hey, what are you doing...@@<br> @@.notmc-speech; You're so tiny, I like you.@@<br> @@.mc-speech;What?...@@<br> @@.mc-thoughts; With a strong push, she <<linkappend "shoved you down onto the bed.">> <<video "characters/rescue/julia/1.1.mp4">> @@.mc-thoughts; Every time you tried to get up, she slapped your ass hard.@@<br> @@.mc-speech; Stop it, <<= setup.MissingWomen.currentRescueGirl()>>. Why are you doing this~Ah!@@<br> @@.mc-thoughts; She didn't stop spanking you, even after you gave up trying to get free.<br> You started moaning with every slap on your ass. Noticing this, Julia [[took off your panties.|RescueJuliaPossessed1]]@@<br> <</linkappend>>@@ <<elseif _check eq 2>> <<image "characters/rescue/julia/2.0.jpg" { width: "100%" }>> @@.mc-thoughts; You slowly regain consciousness, your head throbbing with pain, and the first thing you feel is the tight ropes binding your wrists. You try to move, but your hands and legs are tied up. Flashes of memory come back to you: you came here to save <<= setup.MissingWomen.currentRescueGirl()>>. But something went wrong. <br>@@ @@.mc-speech; <<= setup.MissingWomen.currentRescueGirl()>>! What the fuck...@@<br> @@.mc-thoughts; She came up to you and started slapping@@ <<linkappend "@@.usebtn; your pussy@@">> <<video "characters/rescue/julia/2.1.mp4">> @@.mc-speech;AHhh~ no~ don't do that@@<br> @@.notmc-speech;Of course, I'm sorry, I won't@@<br> @@.mc-thoughts; She left, but came back with a strapon@@<br> <<linkappend "@@.usebtn; Oh fuck@@">> <span id="rescueJuliaPossessed"> <<video "characters/rescue/julia/2.2.mp4">></span> @@.mc-thoughts; She started fucking @@ <<link "@@.usebtn; your pussy.@@">> <<replace "#rescueJuliaPossessed">> <<videoToggle "characters/rescue/julia/2.3.mp4" "characters/rescue/julia/2.2.mp4">> <</replace>> <</link>> @@.mc-speech; Oh... im dripping wet right noooow<br> Uuuuwhhh..@@<<linkappend "@@.usebtn; Im about to...@@">> <<video "characters/rescue/julia/2.4.mp4">> @@.mc-thoughts; You moan loudly and cum.@@<br> @@.mc-speech; The pleasure is hitting me directly in the head@@<br> @@.mc-thoughts; The world before your eyes begins to disappear and you fall asleep.@@<br><br> @@.backbtn; [[Wake up|Church][setup.Time.addHours(6)]]@@<br> <</linkappend>> <</linkappend>> <</linkappend>> <</if>>
<<video "characters/rescue/julia/1.2.mp4">> @@.mc-thoughts; She stuck her fingers into your hot pussy, sending a small shudder of pleasure through your body.@@<br> @@.notmc-speech; You're already dripping wet, and <<linkappend "I'm just getting started.">> <<video "characters/rescue/julia/1.3.mp4">> @@.mc-thoughts; She started to roughly rub your pussy, which made you cum instantly... @@<br> @@.notmc-speech; Hey, I didn't let you cum before my command.@@<br> @@.mc-thoughts;She got up and went somewhere, it seems [[it's over...|RescueJuliaPossessed2]]@@<br> <</linkappend>>@@
<<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/rescue/julia/1.5.mp4">> <</if>> <<if _check eq 2>> <<video "characters/rescue/julia/1.6.mp4">> <</if>> @@.mc-thoughts;But she came back with a huge dildo between her legs @@<br> @@.notmc-speech; We're not done with you yet@@<br> @@.mc-thoughts; She shoved the huge toy into your pussy, still sensitive from the recent orgasm, and started fucking you<br> The room filled with slurping sounds coming from your dripping pussy@@<br> @@.notmc-speech; Good girl, now let's check your <<linkappend "other hole.">> <<set _checkV to random(1,2)>> <<if _checkV eq 1>> <<video "characters/rescue/julia/1.7.mp4">> <</if>> <<if _checkV eq 2>> <<video "characters/rescue/julia/1.8.mp4">> <</if>> @@.mc-speech; Oh fuck! It feels so good... don't stop, I'm almost...@@<br> @@.notmc-speech; No! Don't cum, slut. Let's see how your pussy [[handles this vibrator|RescueJuliaPossessed3]]@@<br> <</linkappend>>@@
<<video "characters/rescue/julia/1.4.mp4">> @@.mc-thoughts; She pressed the vibrator against your pussy, pushing it harder on your clit.@@<br> @@.mc-speech; Oh my god, I can't take it anymore...@@<br> @@.notmc-speech; Cum, slut, you want it, don't you? @@<br> @@.mc-speech; Yes~ Oh my~Ahhh@@<br> @@.mc-thoughts; A shock of pleasure went through your whole body and you [[passed out|Church][setup.MissingWomen.sleepOffHoursAfterEvent()]]@@
<<image "characters/rescue/down.png" { class: "upPointer clickable", onclick: "SugarCube.Engine.play('CityMap');" }>> <div class="flexwrapper"> <<for _h to 1; _h lte 16; _h++>> <<capture _h>> <div @class="'housecard rescuehousecard' + (settings.highlightRescueHouse && _h === setup.MissingWomen.randomRescuePhotoNumber() ? ' cheatRescueHighlight' : '')"> <<image "characters/rescue/house/" + _h + ".jpg" "iconRescuePx">> @@.icontextcity;<<link "Move" "RescueHouse">><<run setup.MissingWomen.setRescueHouse(_h)>> <</link>>@@ </div> <</capture>> <</for>> </div> <<addclass "body" "style-rescue-map">> <<bodyBackground "assets/characters/rescue/house/rescue-map.jpg">> <<if setup.Gui.isCityNightOverlayActive()>> <<addclass "body" "style-rescue-night-overlay">> <</if>>
<<video "characters/rescue/nadia/1.0.mp4">> @@.notmc-speech; Do you like this, <<= setup.Mc.name()>>?@@<br> @@.mc-speech;What the hell? Wait... how do you <<linkappend "know my...">> <<video "characters/rescue/nadia/1.1.mp4">> @@.notmc-speech;Shh, I want you right now...@@<br> @@.mc-speech; Wait, [[what are you doing?|RescueNadiaPossessed1]] Ah~@@<br> <</linkappend>>@@
<<video "characters/rescue/nadia/1.2.mp4">> @@.notmc-speech;Mmm, your nipples are already so hard. Relax, baby, lie down on the bed.@@<br> @@.mc-thoughts; Mm~ No, something's not right.@@<br> @@.mc-thoughts; Fuck! Her tongue is making me so wet,@@ <<linkappend "@@.mc-thoughtsLink; I can't resist@@">> <<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/rescue/nadia/1.3.mp4">> <</if>> <<if _check eq 2>> <<video "characters/rescue/nadia/1.4.mp4">> <</if>> @@.mc-thoughts; I'm god, my whole body is on fire, how is she doing this?@@<br> @@.notmc-speech; You're so sweet, where does Rain find such bitches?@@<br> @@.mc-speech; Oh yes~ [[wait, wha...?|RescueNadiaPossessed2]]@@<br> <</linkappend>><br>
<<set _check to random(1,4)>> <<if _check eq 1>> <<video "characters/rescue/nadia/1.5.mp4">> <</if>> <<if _check eq 2>> <<video "characters/rescue/nadia/1.6.mp4">> <</if>> <<if _check eq 3>> <<video "characters/rescue/nadia/1.7.mp4">> <</if>> <<if _check eq 4>> <<video "characters/rescue/nadia/1.8.mp4">> <</if>> @@.notmc-speech; Shh, shut your dirty little mouth with this huge dick@@<br> @@.mc-thoughts; What am I doing? Why can't I resist her? @@<br> @@.mc-speech; Mmm~ yeah.@@<br> @@.notmc-speech; Good girl, now turn your butt@@ <<linkappend "towards me.">> <<set _checkV to random(1,2)>> <<if _checkV eq 1>> <<video "characters/rescue/nadia/1.9.mp4">> <</if>> <<if _checkV eq 2>> <<video "characters/rescue/nadia/1.10.mp4">> <</if>> @@.mc-speech; Oh fuck! It feels so good... don't stop, I'm almost...@@<br> @@.notmc-speech; Not yet, slut, I haven't played [[with your butt|RescueNadiaPossessed3]] enough.@@<br> <</linkappend>>
<<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/rescue/nadia/1.11.mp4">> <</if>> <<if _check eq 2>> <<video "characters/rescue/nadia/1.12.mp4">> <</if>> @@.notmc-speech; Mm~ What a tight little hole<br> I can feel your anus pulsating, looks like you're ready to cum@@<br> @@.mc-speech; Ahh~Fuck! I can't, I'm cumming@@<br> @@.mc-thoughts; The whole house was filled with your moans, and everything faded from your sight<br> The orgasm was so powerful that you [[passed out...|Church][setup.MissingWomen.sleepOffHoursAfterEvent()]]@@<br>
@@.mc-thoughts; You stepped into the abandoned house, a place that had long since fallen into decay and been forgotten. Right from the doorway, something felt off -- the air was strangely thick, almost heavy on your skin, and a voice deep inside whispered of danger.<br> And then, everything changed. The house started shifting before your eyes. The cracked, worn-out walls were now freshly painted, the dusty old furniture suddenly looked brand new and spotless. Lights flickered on, flooding the place with a cozy glow -- the house had transformed into a perfect, normal home, like nothing had ever been wrong.<br> But something was off. You knew it was all fake. An illusion, a trap.<br> Your instincts screamed that this place was dangerous, and you found yourself torn -- should you keep searching or turn back while you still could?<br>@@ @@.mc-speech; This has to be the right place. But should I keep going? There's something seriously wrong with this place... maybe I should leave while I can.@@<br><br> <span id="choiceRescuePossessed">@@.usebtn; [[Leave|RescueMap]] @@<b>or</b></span><<linkreplace "@@.usebtn; Continue@@">> <<replace "#choiceRescuePossessed">><</replace>> <<run setup.MissingWomen.markQuestFailed()>> <<set _girl to setup.MissingWomen.currentRescueGirl()>> <<if _girl eq "Victoria">> <<video "characters/rescue/victoria/victoriapossessed.mp4">> @@.mc-speech; Oh my god, are you okay?@@<br> @@.notmc-speech; Hmm~ what are you doing here?@@<br> @@.mc-speech; <<= setup.MissingWomen.currentRescueGirl()>>, let's get out of here, I came to save you.@@<br> @@.notmc-speech; No, I don't need help. It's you who will probably need it@@<br> @@.mc-speech;What? Ah~ what's happening...@@<br> @@.notmc-speech; A sharp pain shot through your head, making you collapse to the floor. The last thing you saw before passing out was her walking towards you...@@<br><br> @@.backbtn; <<link "Wake up " "RescueVictoriaPossessed">> <</link>>@@ <<elseif _girl eq "Jade">> <<image "characters/rescue/jade/jadepossessed.png" "displayCentredImgs">> @@.mc-speech; Oh my god, are you okay?@@<br> @@.notmc-speech; Hmm~ what are you doing here?@@<br> @@.mc-speech; <<= setup.MissingWomen.currentRescueGirl()>>, let's get out of here, I came to save you.@@<br> @@.notmc-speech; No, I don't need help. It's you who will probably need it@@<br> @@.mc-speech;What? Ah~ what's happening...@@<br> @@.notmc-speech; A sharp pain shot through your head, making you collapse to the floor. The last thing you saw before passing out was her walking towards you...@@<br><br> @@.backbtn;<<link "Wake up" "RescueJadePossessed">> <</link>>@@ <<elseif _girl eq "Julia">> <<image "characters/rescue/julia/juliapossessed.jpg" { class: "displayCentredImgs", width: "35%" }>><br> @@.mc-speech; Oh my god, are you okay?@@<br> @@.notmc-speech; Hmm~ what are you doing here?@@<br> @@.mc-speech; <<= setup.MissingWomen.currentRescueGirl()>>, let's get out of here, I came to save you.@@<br> @@.notmc-speech;Save me... of course, let's get out of here. Help me get up...@@<br> @@.usebtn; <<link "Come closer to her." "RescueJuliaPossessed">> <</link>>@@<br> <<elseif _girl eq "Nadia">> <<video "characters/rescue/nadia/nadiapossessed.mp4">> @@.mc-speech; Oh my god, are you okay?@@<br> @@.notmc-speech; Hmm~ what are you doing here?@@<br> @@.mc-speech; <<= setup.MissingWomen.currentRescueGirl()>>, let's get out of here, I came to save you.@@<br> @@.notmc-speech;Save me... of course, let's get out of here. But I need to get dressed and find a few things.@@<br> @@.mc-speech; Just be quick.@@<br> @@.notmc-speech; Of course, <<link "follow me" "RescueNadiaPossessed">> <</link>>.@@<br> <<elseif _girl eq "Ash">> <<image "characters/rescue/ash/ashpossessed.jpg" { class: "displayCentredImgs", width: "35%" }>><br> @@.mc-speech; Oh my god, are you okay?@@<br> @@.notmc-speech; Hmm~ what are you doing here?@@<br> @@.mc-speech; <<= setup.MissingWomen.currentRescueGirl()>>, let's get out of here, I came to save you.@@<br> @@.notmc-speech;Save me... of course, let's get out of here. Help me get up...@@<br> @@.usebtn; <<link "Come closer to her." "RescueAshPossessed">> <</link>>@@<br> <<else>> @@.mc-thoughts; Something feels wrong... you should leave this place.@@<br> @@.backbtn; [[Leave|RescueMap]]@@ <</if>> <</linkreplace>>
<<rescueScene setup.MissingWomen.currentRescueGirl()>>
<<set _stayGirl to setup.MissingWomen.currentRescueGirl()>> <<if _stayGirl>> <<rescueStay _stayGirl>> <</if>>
@@.mc-thoughts; You stepped into the abandoned house, a place that had long since fallen into decay and been forgotten. Right from the doorway, something felt off -- the air was strangely thick, almost heavy on your skin, and a voice deep inside whispered of danger.<br> And then, everything changed. The house started shifting before your eyes. The cracked, worn-out walls were now freshly painted, the dusty old furniture suddenly looked brand new and spotless. Lights flickered on, flooding the place with a cozy glow -- the house had transformed into a perfect, normal home, like nothing had ever been wrong.<br> But something was off. You knew it was all fake. An illusion, a trap.<br> Your instincts screamed that this place was dangerous, and you found yourself torn -- should you keep searching or turn back while you still could?<br>@@ @@.mc-speech; This has to be the right place. But should I keep going? There's something seriously wrong with this place... maybe I should leave while I can.@@<br><br> <span id="choiceRescuePossessed">@@.usebtn; [[Leave|RescueMap]] @@<b>or</b></span><<linkreplace "@@.usebtn; Continue@@">> <<replace "#choiceRescuePossessed">><</replace>> @@.mc-thoughts; You're walking down the hallway of the old house when you hear some weird slurping sounds that catch your attention. You stop for a moment, listening, then carefully move closer to where it's coming from.<br> As you peek through a half-open door, you spot <<rescueGirlLink>>@@ <</linkreplace>>
<<run setup.MissingWomen.ensureBoardCooldowns()>> <<run setup.MissingWomen.initRescueGirlPool([ { name: "Victoria", img: "characters/rescue/victoria.jpg" }, { name: "Julia", img: "characters/rescue/julia.jpg" }, { name: "Jade", img: "characters/rescue/jade.jpg" }, { name: "Nadia", img: "characters/rescue/nadia.jpg" }, { name: "Ash", img: "characters/rescue/ash.jpg" } ])>> <<if not setup.MissingWomen.boardOnCooldown()>> <<if setup.MissingWomen.rescueCooldown() eq 0>> <<run setup.MissingWomen.rollBoardGirls()>> <</if>> <<if setup.MissingWomen.boardPostingsOutToday() and setup.MissingWomen.isQuestAvailable()>> <div class="flexwrapper addGap5"> <<for _girl range setup.MissingWomen.rescueRandomGirls()>> <<capture _girl>> <div class="housecard"> <<image _girl.img "contactsImages">> <<print _girl.name>><br> @@.usebtn; <<link "Take" "Church">> <<run setup.MissingWomen.setCurrentRescueGirl(_girl.name)>> <<run setup.MissingWomen.setQuestForRescueStarted()>> <<include "RandomizeRescueHouse">><</link>>@@ </div> <</capture>> <</for>> </div> <<elseif setup.MissingWomen.hasActiveQuest()>> @@.mc-speech; I've already taken the missing poster for <<= setup.MissingWomen.currentRescueGirl()>>, I need to find her first.@@<br> <<elseif setup.MissingWomen.isQuestAvailable()>> @@.mc-speech; The nun said that the missing posters appear in the evening, around 6 PM.@@<br> <<elseif setup.MissingWomen.mustReturnToNun()>> @@.mc-speech;First, I need to go see the nun. She should be at the church. @@ <</if>> <<else>> @@.mc-speech; Enough for today.@@<br> <</if>> <br> <br> @@.backbtn; [[Back|Church]]@@ <br>
<<set _check to random(1,3)>> <<if _check eq 1>> <<image "characters/rescue/victoria/1.0.jpg" { width: "100%" }>> @@.mc-thoughts; You woke up in a dark, damp place. It seems like the basement of that same house. <br> Your head still hurts, and you're struggling to come to your senses@@<br> @@.mc-speech; Ugh... my head...@@<br> @@.mc-speech; Where am I? <<= setup.MissingWomen.currentRescueGirl()>>, is that you? Help me!@@<br> @@.notmc-speech; Hello, sweetheart. Were you trying to save your little friend? You're too late... She's under my control now, completely.@@<br> @@.mc-thoughts; Fuck! It seems that ghost has taken control of her... looks like I have a problem. @@<br> @@.mc-speech; Why are you doing this? Let her go and me too, we'll leave and never come back.@@<br> @@.notmc-speech; Ha, no way. You don't interest me much, but I'll still <<linkappend "teach you a lesson before I let you go.">> <<video "characters/rescue/victoria/1.1.mp4">> @@.mc-speech; Ah~ don't touch me!@@<br> @@.notmc-speech; What a juicy slut I've got here. Relax, I'm just [[getting started.|RescueVictoriaPossessed1][setup.MissingWomen.setVictoriaPossessedStage(1)]]@@<br> <</linkappend>>@@ <</if>> <<if _check eq 2>> <<video "characters/rescue/victoria/2.0.mp4">> @@.mc-thoughts; You woke up in a dark, damp place. It seems like the basement of that same house. <br> Your head still hurts, and you're struggling to come to your senses@@<br> @@.mc-speech; Ugh... my head...@@<br> @@.mc-speech; Where am I? <<= setup.MissingWomen.currentRescueGirl()>>, is that you? Help me!@@<br> @@.notmc-speech; Hello, sweetheart. Were you trying to save your little friend? You're too late... She's under my control now, completely.@@<br> @@.mc-thoughts; Fuck! It seems that ghost has taken control of her... looks like I have a problem. @@<br> @@.mc-speech; Why are you doing this? Let her go and me too, we'll leave and never come back.@@<br> @@.notmc-speech; Ha, no way. You don't interest me much, but I'll still <<linkappend "teach you a lesson before I let you go.">> <<video "characters/rescue/victoria/3.1.mp4">> @@.mc-speech; Ah~ don't touch me!@@<br> @@.notmc-speech; What a juicy slut I've got here. Relax, I'm just [[getting started.|RescueVictoriaPossessed1][setup.MissingWomen.setVictoriaPossessedStage(2)]]@@<br> <</linkappend>>@@ <</if>> <<if _check eq 3>> <<video "characters/rescue/victoria/3.0.mp4">> @@.mc-thoughts; You woke up in a dark, damp place. It seems like the basement of that same house. <br> Your head still hurts, and you're struggling to come to your senses@@<br> @@.mc-speech; Ugh... my head...Fuck, something is in my ass, what the fuck is going on?!@@<br> @@.notmc-speech; Hello, sweetheart. Were you trying to save your little friend? You're too late... She's under my control now, completely.<br> You were out for so long that I couldn't help but have a little fun with you.<br> Good thing you woke up: now we can<<linkappend " enjoy this together.">> <<video "characters/rescue/victoria/3.1.mp4">> @@.mc-speech; Ah~ don't touch me!@@<br> @@.notmc-speech; What a juicy slut I've got here. Relax, I'm just [[getting started.|RescueVictoriaPossessed1][setup.MissingWomen.setVictoriaPossessedStage(3)]]@@<br> <</linkappend>>@@ <</if>>
<<if setup.MissingWomen.victoriaPossessedStage() eq 1>> <<video "characters/rescue/victoria/1.2.mp4">> @@.mc-speech; What are you going to do? ~OH~ fuck~ my butthole@@<br> @@.notmc-speech; Seems like your sweet little hole is ready for@@ <<linkappend "@@.notmc-speechLink; something more...@@">> <<video "characters/rescue/victoria/1.3.mp4">> @@.notmc-speech; Ha, your hole swallowed that dildo right away<br> How many dicks have been in your ass already?@@<br> @@.mc-speech; Fuck, I'm [[cumming|RescueVictoriaPossessed2][setup.MissingWomen.setVictoriaPossessedStage(1)]]@@<br> <</linkappend>> <</if>> <<if setup.MissingWomen.victoriaPossessedStage() eq 2>> <<video "characters/rescue/victoria/2.2.mp4">> @@.mc-speech; Oh~you're gonna tear my ass, please be gentle@@<br> @@.notmc-speech; What a tight ass you have, don't worry,@@ <<linkappend "@@.notmc-speechLink; I'll fix it@@">> <<video "characters/rescue/victoria/2.3.mp4">> @@.notmc-speech; Do you want me to stop? Answer me, whore@@<br> @@.mc-speech; Oh my god, I can't take it anymore, I'm [[cumming|RescueVictoriaPossessed2][setup.MissingWomen.setVictoriaPossessedStage(2)]]@@<br> <</linkappend>> <</if>> <<if setup.MissingWomen.victoriaPossessedStage() eq 3>> <<video "characters/rescue/victoria/3.2.mp4">> @@.mc-speech; Oh~you're gonna tear my ass, please be gentle@@<br> @@.notmc-speech; What a tight ass you have, don't worry,@@ <<linkappend "@@.notmc-speechLink; I'll fix it@@">> <<video "characters/rescue/victoria/3.3.mp4">> @@.notmc-speech; Do you want me to stop? Answer me, whore@@<br> @@.mc-speech; Oh my god, I can't take it anymore, I'm [[cumming|RescueVictoriaPossessed2][setup.MissingWomen.setVictoriaPossessedStage(3)]]@@<br> <</linkappend>> <</if>>
<<if setup.MissingWomen.victoriaPossessedStage() eq 1>> <<video "characters/rescue/victoria/1.4.mp4">> @@.mc-thoughts; She kisses you, and you kiss her back.@@<br> @@.notmc-speech; Did you like that?@@<br> @@.mc-speech; Let me go.@@<br> @@.notmc-speech; Oh, too bad you're not submissive enough. I would've taken over you, but maybe one day I'll get the chance...@@<br> @@.mc-thoughts; She kisses you again, and everything goes black.@@<br> <</if>> <<if setup.MissingWomen.victoriaPossessedStage() eq 2>> <<video "characters/rescue/victoria/3.4.mp4">> @@.mc-thoughts; She kisses you, and you kiss her back.@@<br> @@.notmc-speech; Did you like that?@@<br> @@.mc-speech; Let me go.@@<br> @@.notmc-speech; Oh, too bad you're not submissive enough. I would've taken over you, but maybe one day I'll get the chance...@@<br> @@.mc-thoughts; She kisses you again, and everything goes black.@@<br> <</if>> <<if setup.MissingWomen.victoriaPossessedStage() eq 3>> <<video "characters/rescue/victoria/3.4.mp4">> @@.mc-thoughts; She kisses you, and you kiss her back.@@<br> @@.notmc-speech; Did you like that?@@<br> @@.mc-speech; Let me go.@@<br> @@.notmc-speech; Oh, too bad you're not submissive enough. I would've taken over you, but maybe one day I'll get the chance...@@<br> @@.mc-thoughts; She kisses you again, and everything goes black.@@<br> <</if>> <br> @@.backbtn; [[Wake up|Church][setup.MissingWomen.sleepOffHoursAfterEvent()]]@@<br>
<<run setup.MissingWomen.seedTornStyle()>>
<<widget "rescueGirlLink">> <<set _girlName to setup.MissingWomen.currentRescueGirl()>> <<link _girlName "RescueScene">><</link>> <</widget>> <<widget "videoToggle">> <<set _videoToggle to !_videoToggle>> <<if _videoToggle>> <<video _args[0]>> <<else>> <<video _args[1]>> <</if>> <</widget>> /* Shared body for RescueVictoria/Nadia/Jade/Julia/Ash. The per-girl chapter/variant pool and end clip come from setup.MissingWomen.rescueGirlConfig — the only difference between passages is the girl name passed in. */ <<widget "rescueScene">> <<set _scene to setup.MissingWomen.initRescueScene(_args[0])>> <<set _randomChance to random(1, 100)>> <<set _clickCount to 0>> <<set _caughtChance to 0>> <div id="videoContainer"> <<video _scene.current>> </div> @@.mc-speech; Oh wow~ it's <<= setup.MissingWomen.currentRescueGirl()>>, and it looks like she's... in trouble.<br> I can help her if I use holy water.... or<br> I could watch a little longer and then help her... but I might get noticed. @@<br> @@.warningtext; The chance of being noticed - <<do tag "chanceRescue">>_caughtChance <</do>>@@<br> <span class="rescueWatchButton"><<capture _scene, _randomChance>><<link "@@.usebtn;Watch@@">> <<set _clickCount += 1>> <<if _clickCount lte 4>> <<if _caughtChance gte _randomChance>> <<replace ".rescueWatchButton">> @@.mc-speech; FUCK! They noticed me. I won't have time to take out the holy water, but I could@@ @@.usebtn; [[Run|Church][setup.MissingWomen.markQuestFailed()]]@@ <<done>> <<if not setup.MissingWomen.canStaySubmissive()>> <<addclass ".rescueStayCorruptionCheck" "disabled-link">> <</if>> <</done>> <br> <span class="rescueStayCorruptionCheck"> @@.mc-speech;Or...@@ @@.usebtn;[[Stay|RescueStay][setup.MissingWomen.markQuestFailed()]]@@.@@.mc-speech; I guess I'm already used to losing...@@</span> <<if not setup.MissingWomen.canStaySubmissive()>>@@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 6)@@ <</if>> <br><br> <br> <</replace>> <<replace ".useHolyWaterButton">><</replace>> <</if>> <<set _caughtChance += 20>> <<redo "chanceRescue">> <</if>> <<if _clickCount == 4>> <<run setup.MissingWomen.endRescueScene(_scene)>> <<replace "#videoContainer">> <<video _scene.current>> <</replace>> <</if>> <<if _clickCount < 4>> <<run setup.MissingWomen.advanceRescueScene(_scene)>> <<replace "#videoContainer">> <<video _scene.current>> <</replace>> <</if>> <</link>> <</capture>></span><br> <span class="useHolyWaterButton"><<if not setup.MissingWomen.hasHolyWater()>> @@.mc-thoughts; Fuck! I didn't bring any holy water... I can't do much without it...@@<br><br> @@.backbtn; [[Leave|RescueMap]]@@<br> <<else>> <<linkreplace "@@.usebtn;Use holywater@@">> <<replace ".rescueWatchButton">><</replace>> <<run setup.MissingWomen.useHolyWater()>> @@.mc-thoughts;But there's no time to waste! You quickly start throwing holy water toward the ghost. <br> It lets out a loud hiss, like the water's burning it from the inside. The ghost pulls away from <<= setup.MissingWomen.currentRescueGirl()>> and disappears.@@<br> @@.mc-speech;Let's get out of here before it comes back!@@<br> @@.mc-thoughts; You grab her arm, and the two of you bolt out of the house.<br> She thanks you for saving her and says she'll tell the nun about your help.@@<br> <br><br> @@.backbtn; [[Leave|Church][setup.MissingWomen.markQuestSucceeded()]]@@<br> <</linkreplace>> <</if>></span> <</widget>> /* Shared body for RescueStay branches. Argument is the girl name; the per-girl clip set comes from setup.MissingWomen.rescueStayConfig. Ash uses an indexed cycle (AshBoth1.mp4..AshBoth5.mp4) instead of the two-clip toggle the other girls share. */ <<widget "rescueStay">> <<set _girl to _args[0]>> <<set _stayCfg to setup.MissingWomen.rescueStayConfig(_girl)>> <<if _stayCfg.stay.kind eq "toggle">> <<set _bothA to setup.MissingWomen.stayClipPath(_stayCfg.slug, _stayCfg.stay.base + "1.mp4")>> <<set _bothB to setup.MissingWomen.stayClipPath(_stayCfg.slug, _stayCfg.stay.base + "2.mp4")>> <<set _stayEnd to setup.MissingWomen.stayClipPath(_stayCfg.slug, _stayCfg.stay.endClip)>> <span id="rescueStayContainer"> <<video _bothA>></span> @@.mc-thoughts; You don't even try to resist.@@<br> @@.mc-speech; Let it be what it will be.@@<br> <<capture _bothA, _bothB, _stayEnd>> @@.mc-thoughts; The ghost dragged you to the missing girl and began to have fun with you, using <<link "@@.usebtn; one after the other@@">>. <<replace "#rescueStayContainer">> <<videoToggle _bothB _bothA>> <</replace>> <</link>> His cock, hot and huge, beat inside you, taking up all your attention. You did not pay attention to the fact that <<= setup.MissingWomen.currentRescueGirl()>> sometimes licked your tits and pussy. But all this soon@@ <<linkappend "@@.enterbtn; ended@@">><br> <<video _stayEnd>> @@.mc-thoughts; He finished, but you were shaking all over. From excitement, nerves... from fear, probably. Tired, you@@ @@[[passed out|CityMapPossessed]]@@<br> <</linkappend>> <</capture>> <<elseif _stayCfg.stay.kind eq "ash">> <<set _initialClip to setup.MissingWomen.stayClipPath(_stayCfg.slug, _stayCfg.stay.initial)>> <<set _stayEnd to setup.MissingWomen.stayClipPath(_stayCfg.slug, _stayCfg.stay.endClip)>> <span id="rescueStayContainer"> <<video _initialClip>></span> @@.mc-thoughts; You don't even try to resist.@@<br> @@.mc-speech; Let it be what it will be.@@<br> <<set _videoIndex to 1>> <<capture _stayCfg, _stayEnd>> @@.mc-thoughts; The ghost dragged you to the missing girl and began to have fun with you, using <<link "@@.usebtn; one after the other@@">>. <<set _videoIndex to (_videoIndex + 1) % 6>> <<replace "#rescueStayContainer">> <<set _ashClip to setup.MissingWomen.stayClipPath(_stayCfg.slug, _stayCfg.stay.base + _videoIndex + ".mp4")>> <<video _ashClip>> <</replace>> <</link>> His cock, hot and huge, beat inside you, taking up all your attention. You did not pay attention to the fact that <<= setup.MissingWomen.currentRescueGirl()>> sometimes licked your tits and pussy. But all this soon@@ <<linkappend "@@.enterbtn; ended@@">><br> <<video _stayEnd>> @@.mc-thoughts; He finished, but you were shaking all over. From excitement, nerves... from fear, probably. Tired, you@@ @@[[passed out|CityMapPossessed]]@@<br> <</linkappend>> <</capture>> <</if>> <</widget>>
<<image "ui/img/park.jpg" { width: "100%" }>> @@.location; Park@@<br> @@.mc-thoughts; This park, where green plantings seamlessly transition into forest, offers solitude and a connection to nature, providing a space for relaxation and outdoor activities. @@<br> <<if not setup.Park.hasSportswear()>> @@.mc-speech; I need to buy sportswear.@@<br> <<elseif not setup.Park.isOpen()>> @@.mc-thoughts; Not the best time for training.@@<br> <<elseif setup.Park.joggingOnCooldown()>> @@.mc-speech; Enough for today...@@<br> <<elseif setup.Park.hasEnergyToJog()>> @@.enterbtn; [[Jogging|ParkJogging][setup.Park.spendJoggingEnergy()]]<<image "ui/img/energy.png" { style: "position: relative; top: 0.375em; width:20px;" }>> @@<br> <<else>> @@.mc-speech; Not enough energy@@ <<statIcon setup.StatIcon.ENERGY>><br> <</if>> <br> <br> <br> @@.backbtn;[[Leave|CityMap]]@@<br> <<if previous(2) is "Park">><<addTime 0.5>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 0.5>> <</if>>
<<if setup.Park.canEscapeParkEvent()>> <<run setup.Park.dropEnergyToZero()>> <<video "characters/mc/parkrunend.mp4">> @@.mc-thoughts;You skillfully slip away from her grasping hands, leaving her behind with her unsatisfied lust.@@<br> @@.mc-speech;FUCK! I barely got away from her, I need to be more careful around here.@@<br><br> @@.backbtn; [[Leave|CityMap]]@@<br> <<else>> <<run setup.Park.dropEnergyToZero()>> <<video "characters/mc/parkeventcaught.mp4">> @@.mc-thoughts;She catches up to you, her hot breath on your neck. She calms you, saying she just wants to enjoy your beautiful body before letting you go, filling the air with promises of passion.@@<br> <<linkreplace "@@.usebtn; She puts you on your knees in front of her.@@">> <<video "characters/mc/parkeventbj.mp4">> @@.mc-thoughts;She straps on a dildo, pinning you down, and begins to mercilessly fuck your mouth, making you take her deep, feeling her control over you. She lightly slaps your face, treating you like her personal slut.@@<br> @@.mc-speech;Ugh, you're such a bitch...@@<br> @@.notmc-speech;Let's strip off those unnecessary clothes and see [[how wet you get for me|ParkEvent2]]@@ <</linkreplace>> <</if>>
<span id ="parkEvent2Vids"> <<video "characters/mc/parkeventsex1.mp4">></span> <<set _videoIndex to 1>> @@.mc-thoughts; With a cloth in your mouth, you can only moan as she thrusts the dildo into your pussy, each hard push making you@@ <<link "@@.usebtn; tremble with a mix of pain and pleasure.@@">> <<set _videoIndex to (_videoIndex + 1) % 3>> <<replace "#parkEvent2Vids">> <<video "characters/mc/parkeventsex" + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.mc-speech;Mmmph... it's too much...@@<br> @@.notmc-speech;You're loving this, aren't you?@@<br> <<linkappend "@@.usebtn; No! Fuck you!@@">> <<video "characters/mc/eventend.mp4">> @@.mc-thoughts;She relentlessly fucks your pussy with the dildo, each thrust more invasive than the last, until she suddenly grabs your hair, pulling you up onto your knees. She shoves the dildo, now slick with your own juices, back into your mouth, making you taste your pussy mixed with her dominance over you. Her words sound like a promise or a threat @@<br> @@.notmc-speech; Maybe we'll meet again, baby.@@<br> @@.mc-speech;Fuck you... I hope not.@@<br> @@.notmc-speech;Oh, we will, sweet thing. Count on it.@@<br><br> @@.mc-thoughts; She left you fucked, sitting on the ground, as she walked away into the distance. Your body aches a bit, your pussy is red and sore. @@<br> @@.mc-speech; What a bitch, I hope we never cross paths again.@@<br><br> @@.backbtn; [[Leave|CityMap]] @@<br> <<run setup.Mc.setPenalized(true)>> <<run setup.Home.applyAssaultDebuff()>> <</linkappend>>
<<run setup.Park.startJoggingCooldown()>> <<video "characters/mc/parkevent1.mp4">> @@.mc-thoughts;You're jogging through the park, stopping now and then to catch your breath, sweat glistening on your skin. You notice the same girl too often, as if she craves you, watching your every move.@@<br> <<addTime 60>> <<gymFitnessGain 1>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <br> <<if setup.Park.canContinueJogging()>> <<linkreplace 'Continue jogging <<statIcon setup.StatIcon.ENERGY>>'>> <<if setup.Park.shouldTriggerParkMugging()>> <<goto "ParkMugging">> <<else>> <<set _check to random(30,110)>> <<if setup.Park.isBeautyBelow(_check)>> <<video "characters/mc/parkevent2.mp4">> @@.mc-thoughts;She bursts out from the bushes, her eyes burning with desire, and begins to chase you. Frightened, you try to [[run away from her|ParkEvent1]]@@ <<else>> <<video "characters/mc/parkend.mp4">> @@.mc-thoughts;You keep jogging, enjoying the nature around you. That girl seems to have lost interest in you.@@<br> @@.mc-speech;Maybe I'm not hot enough for her? Haha@@<br> <<addTime 60>> <<gymFitnessGain 1>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <br><br> @@.backbtn; [[Leave|CityMap][setup.Park.spendJoggingEnergy()]] @@<br> <</if>> <</if>> <</linkreplace>> <<else>> @@.mc-speech; I'm too tired. Need to rest@@<br><br> @@.backbtn; [[Leave|CityMap]] @@<br> <</if>>
<<video "characters/mc/parkmugging1.mp4">> @@.mc-thoughts;A man steps out from the trees and plants himself in the middle of the trail. Older than you. Scruffy. His eyes track over you slow enough that you feel them.@@<br> @@.notmc-speech;Hey there, pretty thing. Out here on your own? Got any cash on you?@@<br> @@.mc-thoughts;You glance back. The trail is empty. No joggers, no dogs, no one.@@<br> @@.mc-speech;I... I don't carry cash when I'm running, I swear...@@<br> <<linkreplace "@@.usebtn;He steps closer and reaches into his jacket.@@">> <<video "characters/mc/parkmugging2.mp4">> @@.mc-thoughts;A pistol. Pointed at your chest. Your knees almost give.@@<br> @@.notmc-speech;Don't lie to me, girl. The watch. The phone. All of it. On the ground. Slow.@@<br> @@.mc-thoughts;Your hands shake so badly you nearly drop your fitness watch undoing the strap. The phone follows. You set them on the gravel and step back.@@<br> @@.mc-speech;Th-that's everything. Please. Just let me go.@@<br> <<linkreplace "@@.usebtn;He smirks and looks you over again.@@">> <<video "characters/mc/parkmugging3.mp4">> @@.notmc-speech;Not everything. Strip. Down to your underwear. Right here.@@<br> @@.mc-thoughts;Your stomach drops. The trail is still empty. The gun doesn't move. You peel off your top, then your shorts, kicking them onto his pile. Cool air hits your skin and you wrap your arms across yourself.@@<br> @@.mc-speech;Th-there. I did it. Please let me leave...@@<br> @@.mc-thoughts;He doesn't move. He just looks. Every rustle in the bushes makes you flinch.@@<br> <<linkreplace "@@.usebtn;He shakes his head, grinning.@@">> <<video "characters/mc/parkmugging4.mp4">> @@.notmc-speech;Uh-uh. All of it. Bra. Panties. Off. I wanna watch you walk that bare ass back to the front gate.@@<br> @@.mc-thoughts;Tears sting your eyes as your fingers find the bra clasp. Then the waistband of your panties. You can't look at him. The last scraps drop onto his pile and you're standing there, naked on a public trail, hands fluttering uselessly between your chest and your thighs.@@<br> @@.mc-speech;Please... don't make me walk back like this. Someone'll see me...@@<br> @@.mc-thoughts;He scoops up your clothes, your watch, your phone, and waves the gun back down the trail.@@<br> @@.notmc-speech;Get walking, sweetheart. Don't look back.@@<br> <<linkreplace "@@.usebtn;You start walking.@@">> <<video "characters/mc/parkmugging5.mp4">> @@.mc-thoughts;Gravel bites into your bare feet. Every crunch sounds like a shout. You hunch forward, arms locked across your chest, trying to be small.@@<br> @@.mc-speech;Oh god. Please don't let anyone come around the bend, please...@@<br> @@.mc-thoughts;Laughter drifts through the trees. A couple, maybe. You bolt off the path and crouch behind a bush, breath tight in your throat, waiting for them to pass on some other trail.@@<br> <<linkreplace "@@.usebtn;You force yourself to keep moving.@@">> <<video "characters/mc/parkmugging6.mp4">> @@.mc-thoughts;A jogger appears on the parallel path. You throw yourself behind a tree and press your cheek to the bark, holding your breath until his footsteps fade. You're shaking. Tears are running down your face and you can't wipe them away because both hands are busy covering you.@@<br> @@.mc-speech;What if he saw me? What if anyone sees me...@@<br> @@.mc-thoughts;You peek around the trunk, dart across the open path, and dive into the next clump of bushes. The entrance is closer now. You work your way toward it in short, panicked sprints between cover.@@<br> <<linkreplace "@@.usebtn;The front gate comes into view.@@">> <<video "characters/mc/parkmugging7.mp4">> @@.mc-thoughts;You press flat against the side of a tree and watch the gate. There are always people here. A couple on a bench. A family on the path. A man scrolling on his phone. You wait, breath shallow, waiting for every head to turn the wrong way at the same time.@@<br> @@.mc-speech;Just one second. One second where nobody's looking. Please...@@<br> @@.mc-thoughts;The family rounds the corner. The phone-scroller turns to laugh at something. The couple lean in toward each other. Now. You break from cover and sprint, head down, praying nobody on the other side of that gate ever sees the streaks down your shameful, tear-soaked face.@@<br> @@.mc-thoughts;You make it past the gate and dive into the first side alley you see, hugging the shadows the whole way home.@@<br><br> <<set _exhibAfter to setup.Park.applyMuggingOutcome()>> <<if _exhibAfter isnot null>> @@.mc-speech;Exhibitionism increased: <<= _exhibAfter>> now!@@<br> <</if>> <br> @@.backbtn; [[Leave|CityMap]] @@<br> <</linkreplace>> <</linkreplace>> <</linkreplace>> <</linkreplace>> <</linkreplace>> <</linkreplace>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<div class="flexwrapper"> <div class="housecard"> <<image "ui/img/gym-icon.png" "icon">> <<if setup.Mc.fit() gte 30>> @@.icontextcity; [[Gym|PossessedLocation][setup.Posession.setLocationChoice("gym")]]@@ <<else>> @@.warningtext; Req. fit lvl 30+@@<br> <</if>> </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/home.png" "icon">> @@.icontextcity; [[Home|PossessedLocation][setup.Posession.setLocationChoice("home")]]@@ </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/library-icon.png" "icon">> @@.icontextcity; [[Library|PossessedLocation][setup.Posession.setLocationChoice("library")]]@@ </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/park.png" "icon">> @@.icontextcity; [[Park|PossessedLocation][setup.Posession.setLocationChoice("park")]]@@ </div> <div class="housecard"> </div> <div class="housecard"> <<image "ui/img/church-ico.png" "icon">> <<if setup.Posession.meterAtLeast(5)>> @@.icontextcity; [[Church|PossessedLocation][setup.Posession.setLocationChoice("church")]]@@ <<else>> @@.warningtext; Possession 5+@@<br> <</if>> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> <div class="housecard"> </div> </div> <<nobr>> <<if setup.Gui.isCityNightOverlayActive()>> <<addclass "body" "style-city-night-overlay">> <</if>> <</nobr>>
@@.mc-speech;It seems to have gotten quite warm in the house. Maybe if I take off my outer clothes, I'll feel better?@@<br> <br> @@.mc-thoughts; If your sanity gets lower, you start feeling worse. It begins to seem too warm. From this point, your sanity will decrease despite the presence of lighting in the rooms. This can be prevented by increasing sanity with pills or by taking off your upper clothes . However, being without clothes in the house can be more dangerous...@@<br> <br> <<linkreplace "@@.usebtn;Take upper clothes off@@">> <<goto "Hot1">><</linkreplace>> Or @@.usebtn;[[Nah, too risky|previous()]]@@<br>
<<switch setup.Posession.pantiesState() + "," + setup.Posession.braState()>> <<case "worn,worn">> <<video "characters/mc/underwear-on.webm">> <<case "worn,not worn">> <<video "characters/mc/bra-off.webm" { width: "40%", controls: false }>> <<case "not worn,worn">> <<video "characters/mc/bra-on.webm">> <<case "not worn,not worn">> <<video "characters/mc/underwear-off.webm" { width: "40%", controls: false }>> <</switch>> <<run ["rememberBottomOuter", "rememberTopOuter"].forEach(function(k) { var v = State.variables[k]; if (v) State.variables[v.replace(/(\d+)$/, "State$1")] = setup.ClothingState.NOT_WORN; })>> <br> @@.mc-speech;Am I not beautiful? Who could harm such a cutie? It feels much better, I am ready to [[continue|previous(2)]]@@ <<run setup.Posession.clearHotFlags()>>
<<set _check to random(1,2)>> <<if _check eq 1>> <<video "characters/brook/possessed/1.mp4">> <<elseif _check eq 2>> <<video "characters/brook/possessed/2.mp4">> <</if>> @@.mc-thoughts; You notice a girl with a man...<br>@@ @@.mc-speech; This is Brooke! I have to help her!@@<br> <<if setup.Posession.canPepperSprayBrookeAttacker()>> @@.mc-thoughts; He notices you but doesn't even try to run away. Luckily, you have a pepper spray in your bag. You quickly pull it out and use it. The man flees.@@<br> @@.mc-thoughts; You take her hand and drag her along with you [[the church|RainHelps]]@@ <<run setup.Posession.consumePepperSprayCharge()>> <<else>> @@.mc-thoughts; He notices you but doesn't try to flee. You have no means of defense, and you're not strong enough to fight him. With a single blow, he knocks you to the ground, and you@@ <<linkappend "@@.usebtn; black out@@">> <<run setup.Posession.skipRandomHours()>> <<video "characters/brook/possessed/3.mp4">> @@.mc-thoughts; You wake up from a strange sensation: something warm and wet is trying to penetrate your anus.@@<br> @@.notmc-speech; That's enough. Now I'll check how well you lubed her @@ <<linkappend "@@.usebtn; hole@@">> <<video "characters/brook/possessed/4.mp4">> @@.mc-thoughts; While you are trying to remember what happened and how you ended up in this position, the man climbed on top of you and started fucking you in the ass.@@<br> <<if setup.Posession.analIsVeryLoose()>> @@.mc-thoughts; Your anus easily accepted his cock.@@<br> @@.mc-speech; Ah~ Ah fuck ~Yeah~~@@<br> @@.mc-thoughts; He didn't expect you to enjoy being fucked in the ass, which is why he started to pound his dick harder into you until he spilled all his cum inside you@@<br> <<elseif setup.Posession.analIsTrained()>> @@.mc-thoughts; He quickly penetrated your ass with his hot cock almost without resistance@@<br> @@.mc-speech; Ahh~ not so rough~ ahhh@@<br> @@.mc-thoughts;But that didn't stop him. He continued to rape your ass until he came inside you.@@<br> <<else>> @@.mc-thoughts; Your tight little hole wasn't ready for this. A sharp pain shot through you.@@<br> <<run setup.Mc.setPenalized(true)>> @@.mc-speech; Ah~ no, it hurts~@@<br> @@.mc-thoughts;But that didn't stop him. He continued to rape your ass until he came inside you@@<br> <</if>> @@.mc-thoughts; Brooke hugged you. After a while, she helped you get up and walked you [[home|Sleep][setup.Posession.markBrookePossessedInactive()]]@@<br> <</linkappend>> <</linkappend>> <</if>>
"You hear some strange sounds. Peeking You look through a crack and notice her. She is tied up, and there are two men next to her. They are fucking her. I don't think I should interrupt them..."
@@.mc-thoughts; A strange sensation overwhelms you, and the entire world suddenly fades to black,@@ <<linkappend "@@.usebtn; vanishing as if it never existed@@">> <<set _check to random(1,2)>> <<if _check eq 1>> <<image "mechanics/hunting/possessed/1.0.jpg" { width: "100%" }>> <</if>> <<if _check eq 2>> <<image "mechanics/hunting/possessed/2.0.jpg" { width: "100%" }>> <</if>> @@.mc-thoughts; When you regain awareness, you realize you are tightly bound to a large wooden cross. Before you stands a nun, her gaze stern, her lips moving in silent prayer, though you can't make out a single word.@@<br> @@.notmc-speech; In the name of all that is holy, leave this body, evil spirit, and do not return.@@<br> @@.mc-thoughts; You try to say, "What's going on? Where am I?" but instead, your mouth moves on its own, and you hear your own voice saying:@@<br> @@color:red; You will not drive me out. This body is mine now.@@<br> @@.notmc-speech; Shut up! Leave this girl alone!<br> Ah, it seems prayers won't do... I'll have to@@ <<linkappend "<b>@@.notmc-speechLink;take other measures.@@</b>">> <<if _check eq 1>> <<video "mechanics/hunting/possessed/1.1.mp4">> @@.mc-thoughts; She grabbed a book and started slapping you, more out of anger than to help you.@@<br> @@color:red; You won't be able to help her. She's mine forever.@@<br> <</if>> <<if _check eq 2>> <<set _checkInside to random(1,2)>> <<if _checkInside eq 1>> <<video "mechanics/hunting/possessed/2.1.mp4">> <<elseif _checkInside eq 2>> <<video "mechanics/hunting/possessed/2.2.mp4">> <</if>> @@.mc-thoughts; You see the nun pull out a strapon from somewhere and put it on.@@<br> @@.mc-thoughts; I think this method is the only way@@<br> <</if>> @@.notmc-speech; Maybe I should be more ruthless.@@ <<linkappend "@@.notmc-speechLink; I'll save you, my child@@">> <<if _check eq 1>> <<video "mechanics/hunting/possessed/1.2.mp4">> <</if>> <<if _check eq 2>> <<video "mechanics/hunting/possessed/2.3.mp4">> <</if>> @@.mc-thoughts; Although you're possessed, you feel everything happening to your body with heightened intensity -- as if the possession has sharpened all your senses.<br> Each of her thrusts sends a small jolt of pleasure through your body, building up inside you.@@<br> @@color:red; Haha~ you're going to break this poor girl.@@<br> @@.notmc-speech; Shut up and leave, I know the end is close!@@<br> @@.mc-thoughts; It seems you're at your limit, on the verge of blacking out again.<br> But the nun quickens her pace, and in a moment, an overwhelming wave of pleasure consumes you, forcing a wild scream out of you.@@<br> <<linkappend "@@.usebtn; Some time later@@">> <<if _check eq 1>> <<image "mechanics/hunting/possessed/1end.jpg" { width: "100%" }>> <</if>> <<if _check eq 2>> <<image "mechanics/hunting/possessed/2end.jpg" { width: "100%" }>> <</if>> @@.notmc-speech; You're back. Do you remember what happened?@@<br> @@.mc-speech; Not entirely...@@<br> @@.notmc-speech;You were possessed by a ghost. It's a good thing you didn't do anything harmful to yourself. I'm not sure how this happened, but be more careful next time.<br> You're safe now; I think you can go home and rest.@@<br> @@.mc-speech;Thank you. I really do need to rest.@@<br> <br> @@.backbtn; [[Go home|Sleep]]@@<br> <<if setup.Ghosts.isHunting()>> <<run setup.Companion.clearBlakeCursedItem()>> <<set _tempCorrGained to setup.HauntedHouses.commitTempCorruption()>> Corruption is increased (+ <<= _tempCorrGained.toFixed(2)>>) : <<= setup.Mc.corruption().toFixed(2)>><br> <<run setup.Mc.setDirty(1)>> <<run setup.HauntedHouses.resetToolTimers()>> <<run setup.HauntedHouses.endHunt()>> <<run setup.Wardrobe.loseAllStolen()>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>> <<run setup.Companion.resetHuntState()>> <<run setup.Companion.resetAliceWorkIfNeeded()>> <</if>> <</linkappend>> <</linkappend>> <</linkappend>> <</linkappend>>
<<widget "breakFreePossession">> <<set _maxLevel to _args[0]>> @@.mc-thoughts; Life and awareness return to you in an instant, and with all the strength you have left, you break free.@@ <br> <<if setup.Posession.raiseMeter(_maxLevel)>> <b>Surrender to possession</b> is increased: <<= setup.Posession.meter()>> now!<br> <</if>> @@.enterbtn; [[Next|Possessed]]@@<br> <</widget>>
<<if setup.Posession.locationChoice() eq "library">> <<image "mechanics/possessed/1.jpg" { width: "100%" }>><br> @@.mc-thoughts; You find yourself in a room surrounded by rows of books.@@<br> @@.mc-speech; It seems I'm in a library. But how did I get here?<br>@@ <<linkreplace "@@.usebtn; What's happening?@@">> <<video "mechanics/possessed/1.1.mp4">> @@.mc-thoughts; You're standing and talking to someone, but you can't make sense of the conversation. The words blur together, like they're not even real. You try to move your hand, but it won't obey.@@<br> @@.mc-speech; How is this possible? It feels like I've lost control of my own body.@@<br> @@.mc-thoughts; Suddenly, your lips meet his. His arms wrap around you, and you feel his warmth, his touch, the tension between you. A rush of pleasure floods your senses.@@<br> @@color:red; <em>Don't resist. Just give in to the pleasure</em>@@ - @@.mc-thoughts; A second voice echoes in your mind.@@<br> <<linkreplace "@@.usebtn;Try to resist@@">> <<if setup.Posession.canResistFirstAttempt()>> <<video "mechanics/possessed/1.2.mp4">> @@.mc-thoughts; You try to resist, but you can't concentrate. His touches distract you too much. A moment later, you feel the floor with your knees.@@<br> @@.mc-speech; Oh no, there are people nearby@@<br> @@.mc-thoughts; Seconds later, you began to suck his cock passionately, not forgetting to lick his balls. Your lips and tongue seemed to become more sensitive, the feeling of his cock in your mouth and your wet pussy clouded your mind almost completely.<br> Sometimes, you still gave in to the pleasure: at that moment, you began to push your mouth harder on his cock.@@<br> @@.mc-speech; I have to resist, otherwise this could end badly.@@<br> <<linkreplace "@@.usebtn;Try to resist again@@">> <<if setup.Posession.canResistSecondAttempt()>> <<goto "PossessedLocation1">> <<else>> <<breakFreePossession 6>> <</if>> <</linkreplace>> <<else>> <<breakFreePossession 3>> <</if>> <</linkreplace>> <</linkreplace>> <<elseif setup.Posession.locationChoice() eq "home">> <<video "mechanics/possessed/2.mp4">> @@.mc-thoughts; You find yourself surrounded by a crowd of nearly naked men.@@<br> @@.mc-speech; What the hell? Where am I? What am I doing here, conducting an interview?<br>@@ @@.mc-thoughts; But your face shows only surprise and lust instead of confusion. Your hands reach out to their penises on their own.@@<br> @@color:red; <em>Don't resist. Just give in to the pleasure</em>@@ - @@.mc-thoughts; A second voice echoes in your mind.@@<br> <<linkreplace "@@.usebtn;Try to resist@@">> <<if setup.Posession.canResistFirstAttempt()>> <<video "mechanics/possessed/2.1.mp4">> @@.mc-thoughts; You try to resist, but you can't concentrate. <br> They started undressing you, touching your most intimate places. Yet you didn't even try to stop them, even though you wanted to. Your body wouldn't obey you.@@<br> @@.mc-speech; I need to try again, or this will end badly.@@<br> <<linkreplace "@@.usebtn;Try to resist again@@">> <<if setup.Posession.canResistSecondAttempt()>> <<goto "PossessedLocation1">> <<else>> <<breakFreePossession 6>> <</if>> <</linkreplace>> <<else>> <<breakFreePossession 3>> <</if>> <</linkreplace>> <<elseif setup.Posession.locationChoice() eq "gym">> <<image "mechanics/possessed/3.jpg" { width: "100%" }>><br> @@.mc-thoughts; You find yourself in a gym.@@<br> @@.mc-speech; I don't remember how I got here.<br>@@ <<linkreplace "@@.usebtn; What's happening?@@">> <<video "mechanics/possessed/3.1.mp4">> @@.mc-thoughts; Suddenly, you start undressing. @@<br> @@color:red; Pretty hot in here, isn't it, guys?@@<br> @@.mc-speech; What? Did I just say that? No way.@@<br> @@.mc-thoughts; They watch you with hungry eyes.@@<br> @@.mc-speech; Oh no, how shameful! I need to stop this.@@<br> <<linkreplace "@@.usebtn;Try to resist@@">> <<if setup.Posession.canResistFirstAttempt()>> <<video "mechanics/possessed/3.2.mp4">> @@.mc-thoughts; You try to concentrate, but you can't. It's unsettling that you've pulled down your leggings and started working out with your bare butt, exposing your holes to two strangers.<br> They came closer and started touching your butt.<br>@@ @@color:red; Don't be shy, I'm all yours today.@@<br> @@.mc-speech; SHIT! I need to do something quickly, or this will end really badly for me.@@<br> <<linkreplace "@@.usebtn;Try to resist again@@">> <<if setup.Posession.canResistSecondAttempt()>> <<goto "PossessedLocation1">> <<else>> <<breakFreePossession 6>> <</if>> <</linkreplace>> <<else>> <<breakFreePossession 3>> <</if>> <</linkreplace>> <</linkreplace>> <<elseif setup.Posession.locationChoice() eq "church">> <<image "mechanics/possessed/4.1.jpg" { width: "100%" }>><br> @@.mc-thoughts; You find yourself in a church.@@<br> @@.mc-speech; I don't remember how I got here.<br>@@ @@color:red; Ah~ nun, it seems something has possessed me, help me...@@<br> @@.mc-speech; Is this me speaking? This is so strange...@@<br> @@.notmc-speech; Lie down, you must listen to me, now I will help you@@ <<linkreplace "@@.usebtn; get rid of the possession@@">> <span id ="possessedLocationChurch"> <<video "mechanics/possessed/4.2.mp4">></span> <<set _videoIndex to 2>> @@.mc-thoughts; She started to rape your anus using her @@ <<link "@@.usebtn; hand or dildos@@">> <<set _videoIndex to (_videoIndex % 3) + 2>> <<replace "#possessedLocationChurch">> <<video "mechanics/possessed/4." + _videoIndex+`.mp4`>> <</replace>> <</link>> <<if setup.Posession.canResistFinalAttempt()>> @@color:red; Haa~, fuck that ass, shove it deeper@@<br> @@.mc-speech; Something's wrong...<br> HAaA~ I think I...i~ <<linkreplace "@@.usebtn; commiiiing~@@">> <<image "mechanics/possessed/4.5.jpg" { width: "100%" }>><br> @@.notmc-speech; We did it@@<br> @@color:red; No, we're not done.@@<br> @@.notmc-speech; Whaa..?! what the ...@@<br> @@color:red; I think it's [[my turn now|PossessedLocation1]]@@<br> <</linkreplace>> <<else>> @@.mc-speech; AHh~You are going to break me ~@@<br> @@.notmc-speech; You can handle it, it's almost over, I can feel it.@@<br> @@.mc-speech; Did she hear what I said?<br> So that means... oh~ I think I...i~ <<linkreplace "@@.usebtn; commiiiing~@@">> <<video "mechanics/possessed/4.9.mp4">> @@.notmc-speech; We did it@@<br> @@.mc-speech;Oh~ I, I... I don't remember...@@<br> @@.notmc-speech; You were possessed, but it's all over now, you need to rest.@@<br> @@.mc-thoughts; She kisses you gently on the lips, and you drift into [[sleep|Sleep]] @@<br> <<if setup.Posession.raiseMeter(10)>> <b>Surrender to possession</b> is increased: <<= setup.Posession.meter()>> now!<br> <</if>> <</linkreplace>> <</if>> <</linkreplace>> <<elseif setup.Posession.locationChoice() eq "park">> <<video "mechanics/possessed/5.0.mp4">> @@.mc-thoughts;You're running, but the surroundings are completely unfamiliar.@@<br> @@.mc-speech;Where the@@ <<linkappend "@@.mc-speechLink; hell am I?@@">> <<image "mechanics/possessed/5.1.jpg" { width: "100%" }>><br> @@.mc-thoughts;Suddenly, you notice a man looking at you with clear lust in his eyes.@@<br> @@.notmc-speech;Hey, babe, want to come inside?@@<br> @@.mc-thoughts; His massive, already hard cock protrudes from his robe. You want to say something insulting, but instead, your body starts moving towards him as if by its own accord. You feel your pussy getting wet with anticipation.@@<br> @@.mc-speech;Fuck, what's happening, why can't I control my body?@@<br> @@color:red;Because I'm here, baby. You're mine now.@@<br> <<linkreplace "@@.usebtn; Try to resist@@">> <<if setup.Posession.canResistFirstAttempt()>> <<goto "PossessedLocation1">> <<else>> <<breakFreePossession 3>> <</if>> <</linkreplace>> <</linkappend>> <<else>> @@.mc-thoughts; You feel the possession fading, your senses returning to normal.@@<br> @@.enterbtn; [[Next|Possessed]]@@<br> <</if>>
<<if setup.Posession.locationChoice() eq "library">> <<video "mechanics/possessed/1.3.mp4">> @@.mc-thoughts; You didn't even notice how he bent you over, but his cock quickly made you realize what was happening. He started fucking you. You felt every movement of his hot cock with your wet pussy, every slap on your ass.<br> You're completely losing it.<br>@@ @@color:red; Yes~ fuck me~ more *Ah~<br>@@ @@.mc-speech; No, I can't moan like that, someone might hear me.@@<br> @@.mc-thoughts; And, of course, @@ <<linkappend "@@.mc-thoughtsLink; this had to happen@@">> <<video "mechanics/possessed/1.4.mp4">> @@.notmc-speech; What the hell are you doing here?@@<br> @@.mc-thoughts; You both tried to hide what you were doing.@@<br> <<if setup.Posession.canResistFinalAttempt()>> @@.mc-thoughts; But you almost started yelling at him@@<br> @@color:red; What, are you spying? Maybe you can help him, because one dick is not enough for me@@<br> @@.mc-speech; Oh no@@<br> @@.mc-thoughts; He grabbed you by the hair and@@ <<linkappend "@@.usebtn; dragged you along@@">> <span id ="possessedLocationLibrary"> <<video "mechanics/possessed/1.5.mp4">></span> @@.mc-thoughts; He dragged you to the other library visitors. They quickly figured out what was expected of them.<br> They started fucking you in all holes at the same time, sometimes@@ <<link "@@.usebtn; changing positions@@">> <<replace "#possessedLocationLibrary">> <<set _videoToggle to !_videoToggle>> <<if _videoToggle>> <<video "mechanics/possessed/1.6.mp4">> <<else>> <<video "mechanics/possessed/1.5.mp4">> <</if>> <</replace>> <</link>> @@.mc-thoughts; The sounds of slaps, some wet sounds and moans... Fragments of phrases - about how great it is to fuck you. Everything was mixed and blossomed with sensations.@@<br> @@.mc-thoughts; After a while they put you on your knees and started [[cumming|PossessedLocation2]]@@<br> <</linkappend>> <<else>> @@.mc-thoughts; But you felt better because of it. You managed to regain control of yourself. Gathering your strength, you ran away from there as fast as you could.@@<br> <<if setup.Posession.raiseMeter(10)>> <b>Surrender to possession</b> is increased: <<= setup.Posession.meter()>> now!<br> <</if>> @@.enterbtn; [[Next|Possessed]]@@<br> <</if>> <</linkappend>> <<elseif setup.Posession.locationChoice() eq "home">> <span id ="possessedLocationHome"> <<video "mechanics/possessed/2.2.mp4">></span> @@.mc-thoughts; But instead of running away, you sat on your knees and started sucking their cocks, jerking off the rest with your hands.<br> You couldn't even imagine that you could feel so good just from a blowjob, even though you sucked off@@ <<link "@@.usebtn; a whole crowd@@">> <<replace "#possessedLocationHome">> <<set _videoToggle to !_videoToggle>> <<if _videoToggle>> <<video "mechanics/possessed/2.3.mp4">> <<else>> <<video "mechanics/possessed/2.2.mp4">> <</if>> <</replace>> <</link>> <br> @@.mc-thoughts; Your knees could no longer come together, and you felt wetness gathering at your crotch.@@ @@.mc-thoughts; After a while they started@@ <<linkappend "@@.usebtn; cumming@@">> <span id ="possessedLocationHome1"> <<video "mechanics/possessed/2.4.mp4">></span> @@.mc-thoughts; They cum all over your face,@@ <<link "@@.usebtn; one after the other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#possessedLocationHome1">> <<if _videoToggle>> <<video "mechanics/possessed/2.5.mp4">> <<else>> <<video "mechanics/possessed/2.4.mp4">> <</if>> <</replace>> <</link>> @@color:red; Well, we've only just started. I think we'll go somewhere else now that we're done here. @@<br> @@.mc-speech; Oh, damn@@<br> @@.enterbtn; [[Next|Possessed]]@@<br> <</linkappend>> <<elseif setup.Posession.locationChoice() eq "gym">> <span id ="possessedLocationGym"> <<video "mechanics/possessed/3.3.mp4">></span> @@.mc-thoughts; But instead of running away, you sat on your knees and started sucking their cocks<br> You couldn't even imagine that you could feel so good just from a blowjob, so you kept enjoying them@@ <<link "@@.usebtn; one by one@@">> <<replace "#possessedLocationGym">> <<set _videoToggle to !_videoToggle>> <<if _videoToggle>> <<video "mechanics/possessed/3.4.mp4">> <<else>> <<video "mechanics/possessed/3.3.mp4">> <</if>> <</replace>> <</link>> <br> @@.mc-thoughts; Your knees could no longer come together, and you felt wetness gathering at your crotch.@@<br> <<linkreplace "@@.usebtn;Try to resist again@@">> <<if setup.Posession.canResistFinalAttempt()>> @@color:red; So which one of you will fuck me first?@@<br> @@.mc-speech; Fuck, it doesn't work@@<br> <span id ="possessedLocationGym1"> <<video "mechanics/possessed/3.5.mp4">></span> @@.mc-thoughts; They fucked fast and hard,@@ <<link "@@.usebtn; taking turns@@">> <<set _videoToggle to !_videoToggle>> <<replace "#possessedLocationGym1">> <<if _videoToggle>> <<video "mechanics/possessed/3.6.mp4">> <<else>> <<video "mechanics/possessed/3.5.mp4">> <</if>> <</replace>> <</link>> @@.mc-thoughts; not giving you time to rest.@@ <br> @@.mc-thoughts; But they heard someone enter the gym and they decided to run away@@<br> @@color:red; Fuck! I'm not done, but okay, we'll think of something, right, <<= setup.Mc.name()>>? @@<br> @@.mc-speech; Oh, damn@@<br> @@.enterbtn; [[Next|Possessed]]@@<br> <<else>> @@.mc-thoughts; You managed to regain control of yourself. Gathering your strength, you ran away from there as fast as you could.@@<br> <<if setup.Posession.raiseMeter(10)>> <b>Surrender to possession</b> is increased: <<= setup.Posession.meter()>> now!<br> <</if>> @@.enterbtn; [[Next|Possessed]]@@<br> <</if>> <</linkreplace>> <<elseif setup.Posession.locationChoice() eq "church">> <span id ="possessedLocationChurch1"> <<video "mechanics/possessed/4.6.mp4">></span> <<set _videoIndex to 6>> @@.mc-thoughts; You started to rape her anus using your @@ <<link "@@.usebtn; hand or dildos@@">> <<set _videoIndex to (_videoIndex + 1) % 3 + 6>> <<replace "#possessedLocationChurch1">> <<video "mechanics/possessed/4." + _videoIndex+`.mp4`>> <</replace>> <</link>> @@.notmc-speech; Nooo~ this is not right.. <br> ~Uuuuwhhh ~You're penetrating me too deep@@<br> @@color:red; I'll make you cum, buttslut@@<br> @@.notmc-speech; NNRGGG ~Ah AHHHhh@@<br> @@.mc-thoughts; She can't resist anymore and you continue to stretch her asshole [[again and again....|Possessed]]@@<br> <<elseif setup.Posession.locationChoice() eq "park">> <<video "mechanics/possessed/5.2.mp4">> @@.mc-thoughts; You enter his home, where he's already sprawled out on the couch, waiting. Your body, as if not your own, immediately kneels before him, and you start sucking his enormous cock, which barely fits in your mouth. With one hand, he starts spanking and caressing your ass, occasionally brushing against your wet pussy, making you moan with unexpected pleasure.@@<br> @@.notmc-speech;Yeah, just like that, baby, show me what you can do.@@<br> @@.mc-speech;No, I don't want this... what's wrong with me?@@<br> <<linkreplace "@@.usebtn; Try to resist again@@">> <<if setup.Posession.canResistSecondAttempt()>> <span id ="possessedLocationPark1"> <<video "mechanics/possessed/5.4.mp4">></span> <<set _videoIndex to 4>> @@.mc-thoughts;He takes you, sliding his cock into your already throbbing with desire pussy. You feel each thrust making you lose control, @@ <<link "@@.usebtn; your body moving to the rhythm of his desires@@">> <<set _videoIndex to (_videoIndex + 1) % 3 + 3>> <<replace "#possessedLocationPark1">> <<video "mechanics/possessed/5." + _videoIndex+`.mp4`>> <</replace>> <</link>> @@color:red;Enjoy this, I've waited so long to use a body like yours.@@<br> @@.notmc-speech;You're so tight, seems like you enjoy this more than you let on.@@<br> @@.mc-speech;Oh God... @@ <<linkappend "@@.mc-speechLink; I can't...@@">> <<video "mechanics/possessed/5.6.mp4">> @@.mc-thoughts;You're sitting in front of him, your face covered in sweat, as he erupts, cumming on your tongue, making you taste his seed.@@<br> @@.mc-thoughts;That wasn't me... the ghost made me do it...@@<br> @@.mc-speech;Please, no more...@@<br> @@.notmc-speech;You were magnificent, come back anytime.@@<br> <br> @@color:red; Well, we've only just started. I think we'll go somewhere else now that we're done here. @@<br> @@.mc-speech; Oh, damn@@<br> @@.enterbtn; [[Next|Possessed]]@@<br> <</linkappend>> <<else>> @@.mc-thoughts; Life and awareness return to you in an instant, and with all the strength you have left, you break free.@@ <br> <<if setup.Posession.raiseMeter(10)>> <b>Surrender to possession</b> is increased: <<= setup.Posession.meter()>> now!<br> <</if>> @@.enterbtn; [[Next|Possessed]]@@<br> <</if>> <</linkreplace>> <<else>> @@.mc-thoughts; You feel the possession fading, your senses returning to normal.@@<br> @@.enterbtn; [[Next|Possessed]]@@<br> <</if>>
<<if setup.Posession.locationChoice() eq "library">> <span id ="possessedLocationLibrary1"> <<video "mechanics/possessed/1.7.mp4">></span> @@.mc-thoughts; They cum all over your face,@@ <<link "@@.usebtn; one after the other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#possessedLocationLibrary1">> <<if _videoToggle>> <<video "mechanics/possessed/1.8.mp4">> <<else>> <<video "mechanics/possessed/1.7.mp4">> <</if>> <</replace>> <</link>> <br>@@color:red; Well, we've only just started. I think we'll go somewhere else now that we're done here. @@<br> @@.mc-speech; Oh, damn@@<br> @@.enterbtn; [[Next|Possessed]]@@<br> <<else>> @@.mc-thoughts; You feel the possession fading, your senses returning to normal.@@<br> @@.enterbtn; [[Next|Possessed]]@@<br> <</if>>
<<video "characters/ghosts/specials/spiritblake5.mp4">> @@.mc-thoughts; <<= setup.Companion.name()>> licks your incredibly wet pussy, not forgetting about the stranger's balls<br> Unexpectedly for you, the stranger@@ <<linkappend "@@.mc-thoughtsLink; came right inside you. @@">> <<video "characters/ghosts/specials/spiritblake6.mp4">> @@.mc-thoughts;The sperm flowed out onto <<= setup.Companion.name()>>, covering her face.@@<br> @@.mc-thoughts; <<= setup.Companion.name()>> continued to play with the cum flowing out of you and lick your pussy. When she finishes playing with it, you notice that the stranger has disappeared.@@<br> @@.notmc-speech; Ahh... So this is not a dream?@@<br> @@.mc-speech; I don't think so, it seems like someone fucked us...@@<br> @@.notmc-speech; What the fuck?@@<br> @@.mc-speech;I want to forget this faster, let's go to sleep, I hope he left and doesn't come back@@<br><br> @@.backbtn; [[Sleep]]@@<br> <</linkappend>>
<<image "ui/img/beauty-salon.jpg" { width: "100%" }>> <br> @@.location; Beauty Salon@@<br> @@.mc-thoughts; The beauty salon is a place where you can enhance your uniqueness and style. For now, only piercing services are available, but more options are promised in the future!@@<br> <br> <<if not setup.Salon.isOpen()>> @@.mc-thoughts;Beauty Salon is not open right now (open from 8 AM to 10 PM)@@<br> <<else>> <span class="enterbtn">[[Go inside|BeautySalonInside]]</span><br> <</if>> <br> <span class="backbtn">[[Leave|CityMap]]</span><br> <<if previous(2) is "Beauty Salon">><<addTime 3>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 3>> <</if>>
<<image "ui/img/beauty-salon-inside.jpg" { width: "85%" }>><br> @@.enterbtn; [[Piercing|BeautySalonPiercing]]@@ <br> @@.enterbtn; [[Tattoos|BeautySalonTattoos]]@@<br> <br> @@.backbtn; [[Leave|BeautySalon]] @@<br>
<div class="flexwrapper backgroundForText"> <<salonItem "earsPiercing" "characters/mc/piercing/earspiercing.jpg" 50 "BeautySalonPiercing" "+2 beauty" 2>> <<salonItem "nosePiercing" "characters/mc/piercing/nosepiercing.jpg" 70 "BeautySalonPiercing" "+3 beauty" 3>> <<salonItem "tonguePiercing" "characters/mc/piercing/tonguepiercing.jpg" 100 "BeautySalonPiercing" "Becomes more sensitive" 0 "piercingTongueAddSens" 0.1>> <<salonItem "titsPiercing" "characters/mc/piercing/titspiercing.jpg" 130 "BeautySalonPiercing" "Becomes more sensitive" 0 "piercingTitsAddSens" 0.1>> <<salonItem "pussyPiercing" "characters/mc/piercing/pussypiercing.jpg" 150 "BeautySalonPiercing" "Becomes more sensitive" 0 "piercingPussyAddSens" 0.1>> </div> <br> @@.backbtn;[[Leave|BeautySalonInside]] @@<br> <<bodyBackground "assets/ui/img/beauty-salon-inside.jpg">>
<div class="flexwrapper backgroundForText"> <<salonItem "tattooFace" "characters/mc/tattoos/tattoo-face.jpg" 100 "BeautySalonTattoos" "+2 beauty" 2>> <<salonItem "tattooNeck" "characters/mc/tattoos/tattoo-neck.webp" 80 "BeautySalonTattoos" "+2 beauty" 2>> <<salonItem "tattooHand" "characters/mc/tattoos/tattoo-hand.jpg" 50 "BeautySalonTattoos" "+1 beauty" 1>> <<salonItemCorruption "tattooChest" "characters/mc/tattoos/tattoo-chest.jpg" 150 "BeautySalonTattoos" "+3 beauty" 5 3>> <<salonItemCorruption "tattooPussy" "characters/mc/tattoos/tattoo-pussy.webp" 200 "BeautySalonTattoos" "+3 beauty" 5 3>> <<salonItemCorruption "tattooAss" "characters/mc/tattoos/tattoo-ass.jpg" 350 "BeautySalonTattoos" "+3 beauty" 5 3>> </div> <br> @@.backbtn;[[Leave|BeautySalonInside]] @@<br> <<bodyBackground "assets/ui/img/beauty-salon-inside.jpg">>
<<for _p range setup.piercingList>> <<capture _p>> <<set _linkImg to `<<image "characters/mc/piercing/${_p.img}">>`>> <<if State.variables[_p.var] eq setup.ClothingState.WORN>> <<replace `"#currentPiercing" + _p.target`>> <<link _linkImg "Wardrobe">> <<run State.variables[_p.var] = setup.ClothingState.NOT_WORN>> <<if _p.beauty>><<run setup.Mc.addBeauty(-_p.beauty)>><</if>> <<if _p.sensVar>> <<run State.variables[_p.sensVar] = 0>> <<run State.variables[_p.lustVar] = 0>> <</if>> <</link>> <</replace>> <<elseif State.variables[_p.var] eq setup.ClothingState.NOT_WORN>> <<append "#availablePiercing">> <<link _linkImg "Wardrobe">> <<run State.variables[_p.var] = setup.ClothingState.WORN>> <<if _p.beauty>><<run setup.Mc.addBeauty(_p.beauty)>><</if>> <<if _p.sensVar>> <<run State.variables[_p.sensVar] = 0.1>> <</if>> <</link>> <</append>> <</if>> <</capture>> <</for>>
<<widget "salonItem">> <<set _varName to _args[0]>> <<set _img to _args[1]>> <<set _price to _args[2]>> <<set _returnPassage to _args[3]>> <<set _bonusText to _args[4]>> <<set _beautyBonus to (typeof _args[5] !== "undefined") ? _args[5] : 0>> <<set _extraVar to (typeof _args[6] !== "undefined") ? _args[6] : "">> <<set _extraVal to (typeof _args[7] !== "undefined") ? _args[7] : 0>> <div class="housecard"> <<if ndef State.variables[_varName]>> <<image _img "iconPx">><br> <span class="priceAmount"><<= _price>>$</span><br> <span class="mc-thoughts">_bonusText</span><br> <<if setup.Mc.money() gte _price>> <<capture _varName, _price, _returnPassage, _beautyBonus, _extraVar, _extraVal>> @@.buyItemLink;<<link "Buy" _returnPassage>> <<run State.variables[_varName] = setup.ClothingState.WORN>> <<run setup.Mc.removeMoney(_price)>> <<if _beautyBonus>><<run setup.Mc.addBeauty(_beautyBonus)>><</if>> <<if _extraVar>><<run State.variables[_extraVar] = _extraVal>><</if>> <</link>>@@<br> <</capture>> <<else>> @@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <</widget>> <<widget "salonItemCorruption">> <<set _varName to _args[0]>> <<set _img to _args[1]>> <<set _price to _args[2]>> <<set _returnPassage to _args[3]>> <<set _bonusText to _args[4]>> <<set _reqCorruption to _args[5]>> <<set _beautyBonus to (typeof _args[6] !== "undefined") ? _args[6] : 0>> <<set _extraVar to (typeof _args[7] !== "undefined") ? _args[7] : "">> <<set _extraVal to (typeof _args[8] !== "undefined") ? _args[8] : 0>> <div class="housecard"> <<if ndef State.variables[_varName]>> <<image _img "iconPx">><br> <<if setup.Mc.corruption() gte _reqCorruption>> <span class="priceAmount"><<= _price>>$</span><br> <span class="mc-thoughts">_bonusText</span><br> <<if setup.Mc.money() gte _price>> <<capture _varName, _price, _returnPassage, _beautyBonus, _extraVar, _extraVal>> @@.buyItemLink;<<link "Buy" _returnPassage>> <<run State.variables[_varName] = setup.ClothingState.WORN>> <<run setup.Mc.removeMoney(_price)>> <<if _beautyBonus>><<run setup.Mc.addBeauty(_beautyBonus)>><</if>> <<if _extraVar>><<run State.variables[_extraVar] = _extraVal>><</if>> <</link>>@@<br> <</capture>> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <<else>> @@.warningtext; Req. _reqCorruption+ <<image "ui/img/corruption.png" { style: "position: relative; top: 0.375em; width:30px; display: inline; margin: 0;" }>>@@<br> <</if>> <</if>> </div> <</widget>>
<<video "characters/ghosts/specials/mare2.1.mp4">> @@.mc-speech;Something touches me while I sleep.@@ <<linkappend "@@.mc-speechLink;Watch more.@@">> <<video "characters/ghosts/specials/mare2.2.mp4">> @@.mc-thoughts; You barely hear the whisper, but it's clearly @@<<linkappend "@@.mc-thoughtsLink; not your voice@@">><br> @@.notmc-speech; Soon, I will completely possess your body. You will be mine.@@<br> @@.mc-speech; I don't even remember how I woke up...It seems this has gone too far.@@<br> <br> @@.backbtn; [[Back|Use PC]] @@ <</linkappend>> <</linkappend>>
<<video "characters/ghosts/specials/mare1.1.mp4">> <<if not setup.SpecialEvent.knowsAboutMare()>> @@.mc-speech;Am I touching myself in my sleep? Strange...I need to @@ <<else>> @@.mc-speech; Is this really happening again? I need to@@ <</if>> <<linkappend "@@.mc-speechLink;watch more.@@">> <<video "characters/ghosts/specials/mare1.2.mp4">> @@.mc-thoughts; You barely hear the whisper, but it's clearly @@<<linkappend "@@.mc-thoughtsLink; not your voice@@">><br> @@.notmc-speech;You can never escape from me... I am always here... Always watching...@@<br> <<if not setup.SpecialEvent.knowsAboutMare()>> @@.mc-speech;What is this? Whose voice is that? And what should I do about it? I need to do something urgently. I think I should check the internet again.@@ <<else>> @@.mc-speech;Yes, it's definitely the ghost Mare. But now I know what to do; I just need to use the holy water in the bedroom and it will disappear immediately. Although, judging by the video, this is only the initial stage, which means I still have some time.@@ <</if>> <br> <br> @@.backbtn; [[Back|Use PC]] @@ <</linkappend>> <</linkappend>>
<<video "characters/ghosts/specials/mare0.mp4">> @@.mc-speech;Nothing happens@@<br> <br> @@.backbtn; [[Back|Use PC]] @@
<<video "characters/ghosts/specials/mare3.1.mp4">> @@.mc-thoughts;You wake up to an unexpected chill spreading through your entire body. Trying to comprehend what's happening, you realize you're lying on the cold floor of your bedroom. Your body feels paralyzed, but you sense a presence.<br> Something is getting into your pussy but you can't look back. You try to resist, but it seems useless.<br> @@ <<linkappend "@@.mc-speechLink;Ah~What the~ fuck.@@">> <<video "characters/ghosts/specials/mare3.2.mp4">> @@.mc-thoughts; With each penetration it sends shivers of pleasure throughout your body, making you moan. Lust begins to consume your thoughts. Your eyelids grow heavy, and your mind becomes foggy. Before losing consciousness, a wave of pleasure washes over your entire body, and you completely surrender to the ghost's power.@@ <<run setup.SpecialEvent.clearMareEvent()>> <<run setup.Mc.setDirty(1)>> <br> <br> @@.backbtn; [[You black out|Sleep]] @@ <</linkappend>>
<<set _videoList to ["characters/ghosts/myling/1.mp4", "characters/ghosts/myling/2.mp4", "characters/ghosts/myling/3.mp4", "characters/ghosts/myling/4.mp4", "characters/ghosts/myling/5.mp4", "characters/ghosts/myling/6.mp4", "characters/ghosts/myling/7.mp4", "characters/ghosts/myling/8.mp4", "characters/ghosts/myling/9.mp4", "characters/ghosts/myling/10.mp4", "characters/ghosts/myling/11.mp4"]>> <<set _randomIndex to random(0, _videoList.length - 1)>> <<run setup.SpecialEvent.recordMylingVideo(_videoList[_randomIndex])>> <<randomVideoFromList _videoList>> @@.mc-thoughts; You walk down the street, heading home after yet another ghost hunt. The city has its own kind of life at this hour: groups of people leaving late-night bars, couples wandering after long dinners, and the occasional car driving by. But as you keep walking, you start to notice something strange. People are staring. Almost everyone you pass glances your way. Some smile, others turn their heads for a second look, and one man even whistles, as if something about you has really caught his eye.@@<br> You feel a little uneasy. Why are they all looking at you? Your cheeks flush under their gazes. <br> @@.mc-speech; What's wrong?@@<br> @@.mc-thoughts; You quickly check yourself--your clothes are on, everything seems fine. But something feels off. Why does the attention feel so intense? They're looking at you like they see something you don't. Could it just be leftover stress from the hunt?@@<br> <br> @@.movebtn;[[You're finally home|Livingroom][setup.Time.addHours(1)]]@@<br>
<<set _videoList to []>> <<set _videoList to ["characters/ghosts/myling/duo1.mp4", "characters/ghosts/myling/duo2.mp4", "characters/ghosts/myling/duo3.mp4", "characters/ghosts/myling/duo4.mp4", "characters/ghosts/myling/duo5.mp4", "characters/ghosts/myling/duo6.mp4", "characters/ghosts/myling/duo7.mp4", "characters/ghosts/myling/duo8.mp4"]>> <<set _randomIndex to random(0, _videoList.length - 1)>> <<set _selectedVideo to _videoList[_randomIndex]>> <<video _selectedVideo>> @@.mc-thoughts; You walk down the street, heading home after yet another ghost hunt. But as you keep walking, you start to notice something strange. People are staring. Almost everyone you pass glances your way. Some smile, others turn their heads for a second look, and one man even whistles, as if something about you has really caught his eye.@@<br> @@.mc-speech; Why are they looking at us like that?@@<br> @@.notmc-speech;I don't know. Let's get home quickly.@@<br><br> @@.backbtn;[[You're finally home|WalkHomeTogether][setup.Time.addHours(1)]]@@<br> <<run setup.SpecialEvent.resetHuntPlansAfterMyling()>>
<<run setup.SpecialEvent.markSpiritEventSeen()>> <<video "characters/ghosts/specials/spirit2.0.mp4">> @@.mc-thoughts;You decide to take a nap, and someone starts touching you. You feel it through your sleep, but you don't pay attention to it. It stops for a few seconds, and it seems that@@ <<linkappend "@@.usebtn; everything is over. @@">> <<video "characters/ghosts/specials/spirit2.1.mp4">> @@.mc-thoughts;But suddenly, you feel something warm penetrating your pussy, causing you to involuntarily moan, yet you continue to lie motionless, thinking it's just a dream. This continues for some time, bringing waves of pleasure, but you still don't fully wake up.<br> Then everything@@ @@.usebtn; [[stops for a moment.|GhostSpecialEventNapSpirit1]]@@ <</linkappend>>
<<video "characters/ghosts/specials/spirit2.2.mp4">> @@.mc-thoughts; You open your eyes and notice a dick next to your face. Thoughts race through your mind--could this be real? As you try to process what's happening, it ends up@@ <<linkappend "@@.usebtn; in your mouth.@@">> <<video "characters/ghosts/specials/spirit2.3.mp4">> @@.mc-speech; Someone is fucking my mouth!@@ @@.mc-thoughts; It takes you a while to fully grasp what's happening. You decide to stop it, but the mysterious figure vanishes as suddenly as it appeared. You're left in @@@@.usebtn; [[shock and confusion|Bedroom]]@@, @@.mc-thoughts; with your mouth full of sperm.@@<br> <br> <</linkappend>>
<<run setup.SpecialEvent.startSpiritEventCooldown()>> <<if setup.SpecialEvent.hasEnergyForSleepSpirit()>> <<video "characters/ghosts/specials/spirit3.0.mp4">> @@.mc-thoughts; You lie in bed, deeply asleep. But something disturbs your peace. You feel a light touch on your body -- like it's a remnant from your last hunt. You think it will pass, and you let yourself sink@@ <<linkappend "@@.usebtn; deeper into sleep.@@">><br> <<video "characters/ghosts/specials/spirit3.1.mp4">> <<if not setup.SpecialEvent.hasMinCorruptionForSleepSpirit()>> @@.mc-thoughts; But the touches grow bolder. Invisible hands seem to glide across your skin, slowly exploring your body. You feel fingers gently slipping between your thighs, teasing your most sensitive spot. Occasionally, fingers brush your lips, and instinctively, you part them, letting your tongue flicker over the tips, tasting the sensation. The feeling is strange, but you remain lost in the haze of sleep, @@ <<linkappend "@@.usebtn; convinced it's only a dream@@">><br> @@.mc-thoughts; However, the hands become more daring, and it's impossible to ignore now. <br>@@ <<video "characters/ghosts/specials/spirit3.4.mp4">> @@.mc-thoughts; Your body tenses, and suddenly, you realize -- this isn't a dream. Someone is touching you. You open your eyes and sit up abruptly. The room is empty. There's no one there, but your heart races. The lingering feeling of those touches still clings to your skin. @@<br> @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 5)@@<br> <br> @@.backbtn; [[Sleep|Sleep]]@@<br> <</linkappend>> <<else>> @@.mc-thoughts; However, the touches don't stop. You feel gentle hands caressing your pussy, occasionally slipping into your equally sensitive mouth. This sends a shiver down your spine and stirs a strange wave of pleasure. You can't stop the sensation, but it becomes more real with each passing second. You spread your legs, allowing the touches to go deeper, filling you with excitement. Fingers slide into your pussy, and@@ @@.usebtn; [[you can no longer resist|GhostSpecialEventSleepSpirit1]]@@ <</if>> <</linkappend>> <<else>> <<video "characters/ghosts/specials/spirit4.0.mp4">> @@.mc-thoughts; You lie in bed, deeply asleep. But something disturbs your peace. You feel a light touch on your body -- like it's a remnant from your last hunt. You think it will pass, and you let yourself sink@@ <<linkappend "@@.usebtn; deeper into sleep.@@">> <<video "characters/ghosts/specials/spirit4.1.mp4">> @@.mc-thoughts; You feel something trying to slip into your tender mouth, and, exhausted after a long day, you almost unconsciously give in. Fatigue overwhelms and you instinctively begin to suck. Your mind too drowsy to fully grasp what's happening. It sends a shiver through you and a wave of strange pleasure. You can't stop the sensation as it becomes more and more real. You spread your legs, allowing the touches to go deeper. Fingers slide over your pussy, @@ @@.usebtn;[[filling you with excitement.|GhostSpecialEventSleepSpirit2]]@@ <</linkappend>> <</if>>
<<run setup.SpecialEvent.markSpiritEventStage()>> <<video "characters/ghosts/specials/spirit3.2.mp4">> @@.mc-thoughts; When he finally enters you, you realize this is not just a dream, but the passion consumes you entirely. Your hips instinctively move towards him, offering yourself, feeling your body arching into a submissive position. The pleasure is so overwhelming that you no longer want@@ <<linkappend "@@.usebtn; it to end.@@">><br> <<video "characters/ghosts/specials/spirit3.3.mp4">> @@.mc-thoughts; But suddenly, everything stops. You feel something warm and sticky on your body. It spreads across your skin like a heated liquid. You run your hands over it, rubbing it in before bringing it to your lips, tasting it. Exhaustion overtakes you, and you drift back into@@ @@.movebtn; [[sleep|Sleep]]@@ <br> <</linkappend>>
<<run setup.SpecialEvent.markSpiritEventStage()>> <<video "characters/ghosts/specials/spirit4.2.mp4">> @@.mc-thoughts;Gradually, you feel something penetrating your pussy. Fatigue and drowsiness cloud your mind, and you can't clearly understand what's happening. Instead, a strange sensation in your sweet slit becomes increasingly pleasant. You feel how this touch brings unexpected waves of pleasure, and your body starts to respond to them. You let yourself relax and enjoy these warm and sweet sensations @@ <<linkappend "@@.usebtn; as sleep envelops you more deeply@@">> <<video "characters/ghosts/specials/spirit4.3.mp4">> @@.mc-thoughts;But then everything suddenly stops. You feel something covering your body. This strange substance spreads over your skin, leaving traces of warmth and moisture. Your fatigue and satisfaction slowly carry you into sleep, and you drift into sweet oblivion, craving nothing more.@@<br> <br> @@.backbtn; [[Sleep|Sleep]]@@<br> <</linkappend>>
<<run setup.SpecialEvent.markSpiritEventStage()>> <<set _videoToggle to true>> <<if setup.SpecialEvent.companionIs("Brook")>> @@.mc-thoughts; You both wake up to a noise nearby. Next to you, you notice a vague figure with a hard cock near your face. Not fully realizing what's happening, you try to focus on the stranger, but your attention is completely drawn to the big dick, almost pressing against your mouth.@@<br> <<linkappend "@@.mc-speechLink; What the~@@">> <span id ="walkhomebrookspirit"> <<video "characters/ghosts/specials/spiritbrooke2.mp4">></span> @@.mc-thoughts; Before you can finish speaking, his thick cock slips into your mouth. <<= setup.Companion.name()>> doesn't stand by and moves in to lick it. <br> He starts playing with you like dolls, using your mouths <<link "@@.usebtn; one after the other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomebrookspirit">> <<if _videoToggle>> <<video "characters/ghosts/specials/spiritbrooke2.mp4">> <<else>> <<video "characters/ghosts/specials/spiritbrooke1.mp4">> <</if>> <</replace>> <</link>> @@.notmc-speech; Mm~slurp~slurp~@@<br> @@.mc-thoughts; Slurping sounds are heard throughout the room. You feel yourself beginning to give in to passionate desire, allowing this stranger@@ <<linkappend "@@.mc-thoughtsLink; to do whatever he wants.@@">><br> <span id ="walkhomebrookspirit1"> <<video "characters/ghosts/specials/spiritbrooke3.mp4">></span> @@.mc-thoughts; You both feel like you need to make this stranger cum. You decide to @@<<link "@@.usebtn; suck his cock in turns to catch your breath.@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomebrookspirit1">> <<if _videoToggle>> <<video "characters/ghosts/specials/spiritbrooke3.mp4">> <<else>> <<video "characters/ghosts/specials/spiritbrooke4.mp4">> <</if>> <</replace>> <</link>> @@.mc-thoughts; Eventually, the mysterious figure can't stand your passion and @@<<linkappend "@@.mc-thoughtsLink; cums on you.@@">> <<video "characters/ghosts/specials/spiritbrooke5.mp4">> @@.mc-thoughts; You're more pleased with yourself than ever before, and you start playing with his cum, kissing each other. When you finish playing with it, you notice that the stranger has disappeared.@@ @@.notmc-speech; Was it a dream?@@<br> @@.mc-speech; I don't think so, it seems like we just gave someone a blowjob...@@<br> @@.notmc-speech; What the fuck?@@<br> @@.mc-speech;I want to forget this faster, let's go to sleep, I hope he left and doesn't come back@@<br><br> @@.backbtn; [[Sleep]]@@<br> <</linkappend>> <</linkappend>> <</linkappend>> <<elseif setup.SpecialEvent.companionIs("Alice")>> @@.mc-thoughts; You both wake up to a noise nearby. Next to you, you notice a vague figure with a hard cock near your face. Not fully realizing what's happening, you try to focus on the stranger, but your attention is completely drawn to the big dick, almost pressing against your mouth.@@<br> <<linkappend "@@.mc-speechLink; What the~@@">> <<video "characters/ghosts/specials/spiritalice1.mp4">> @@.mc-thoughts; Before you can finish speaking, his thick cock slips into your mouth. <<= setup.Companion.name()>> doesn't stand by and moves in to lick it. <br>@@ @@.notmc-speech; Mm~slurp~slurp~@@<br> @@.mc-thoughts; But he didn't stop at just your mouths. He shoved his hot cock into your pussies and @@ <<linkappend "@@.mc-thoughtsLink; started fucking you.@@">><br> <span id ="walkhomealicespirit"> <<video "characters/ghosts/specials/spiritalice2.mp4">></span> @@.mc-thoughts; He starts playing with you like dolls, using your pussies@@<<link "@@.usebtn; in turn.@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomealicespirit">> <<if _videoToggle>> <<video "characters/ghosts/specials/spiritalice2.mp4">> <<else>> <<video "characters/ghosts/specials/spiritalice3.mp4">> <</if>> <</replace>> <</link>> @@.mc-thoughts; You feel that the stranger is about to cum and press against his penis, trying to catch @@<<linkappend "@@.mc-thoughtsLink; every drop of his sperm.@@">> <<video "characters/ghosts/specials/spiritalice4.mp4">> @@.mc-thoughts; You're more pleased with yourself than ever before, and you start playing with his cum, kissing each other. When you finish playing with it, you notice that the stranger has disappeared.@@<br> @@.notmc-speech; Was it a dream?@@<br> @@.mc-speech; I don't think so, Seems like someone just fucked us...@@<br> @@.notmc-speech; What the fuck?@@<br> @@.mc-speech;I want to forget this faster, let's go to sleep, I hope he left and doesn't come back@@<br><br> @@.backbtn; [[Sleep]]@@<br> <</linkappend>> <</linkappend>> <</linkappend>> <<elseif setup.SpecialEvent.companionIs("Blake")>> <span id ="walkhomeblakespirit"> <<video "characters/ghosts/specials/spiritblake1.0.mp4">></span> @@.mc-thoughts; You're asleep next to your friend <<= setup.Companion.name()>> when you both start to feel something @@ <<link "@@.usebtn; touching you. @@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomeblakespirit">> <<if _videoToggle>> <<video "characters/ghosts/specials/spiritblake1.0.mp4">> <<else>> <<video "characters/ghosts/specials/spiritblake1.1.mp4">> <</if>> <</replace>> <</link>> @@.mc-thoughts; You both wake up to see a blurry figure in front of you. Next to you, you notice a vague figure with a hard cock near your face. Not fully realizing what's happening, you try to focus on the stranger, but your attention is completely drawn to the big dick, almost pressing against your mouth.@@<br> <<linkappend "@@.mc-speechLink; What the~@@">> <span id ="walkhomeblakespirit1"> <<video "characters/ghosts/specials/spiritblake2.1.mp4">></span> @@.mc-thoughts; Before you can finish speaking, his thick cock slips into your mouth. <<= setup.Companion.name()>> doesn't stand by and moves in to lick it. <br> He starts playing with you like dolls, using your mouths <<link "@@.usebtn; one after the other@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomeblakespirit1">> <<if _videoToggle>> <<video "characters/ghosts/specials/spiritblake2.1.mp4">> <<else>> <<video "characters/ghosts/specials/spiritblake2.0.mp4">> <</if>> <</replace>> <</link>> @@.notmc-speech; Mm~slurp~slurp~@@<br> @@.mc-thoughts; Slurping sounds are heard throughout the room. You feel yourself beginning to give in to passionate desire, allowing this stranger@@ <<linkappend "@@.mc-thoughtsLink; to do whatever he wants.@@">><br> <span id ="walkhomeblakespirit2"> <<video "characters/ghosts/specials/spiritblake3.mp4">></span> @@.mc-thoughts; He starts playing with you like dolls, using your pussies@@<<link "@@.usebtn; in turn.@@">> <<set _videoToggle to !_videoToggle>> <<replace "#walkhomeblakespirit2">> <<if _videoToggle>> <<video "characters/ghosts/specials/spiritblake3.mp4">> <<else>> <<video "characters/ghosts/specials/spiritblake4.mp4">> <</if>> <</replace>> <</link>> @@.mc-thoughts; But he didn't stop there. He put you on top of <<= setup.Companion.name()>> so that your pussy was right next to her mouth and started [[fucking you|spiritBlake]] @@ <</linkappend>> <</linkappend>> <</if>>
<<run setup.SpecialEvent.startSpiritEventCooldown()>> <<video "characters/ghosts/specials/spirit1.0.mp4">> @@.mc-thoughts; You settled in front of the TV and soon fell asleep. But something strange disrupts your peace--an almost imperceptible feeling of someone's presence nearby. You sense gentle hands gliding over your body, exploring every curve and contour. These touches send shivers and excitement through you. Your sleep isn't too deep, and you gradually wake up, opening your eyes and realizing that something @@ <<linkappend "@@.usebtn; unusual is happening...@@">> <<video "characters/ghosts/specials/spirit1.1.mp4">> <<if not setup.SpecialEvent.hasMinCorruptionForTVSpirit()>> @@.mc-thoughts;You open your eyes to find a dick right next to your face. In an instant, it's in your mouth. You react in shock, jumping up, but the ghost has already vanished, leaving you bewildered @@<br> @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 3)@@<br> <br> @@.backbtn; [[Get up|Livingroom]]@@<br> <<else>> @@.mc-thoughts;You open your eyes to find a dick right next to your face. In an instant, it is in your mouth. Overwhelmed and unsure how to respond, you find yourself powerless as the mysterious stranger takes charge. He begins to thrust confidently into your mouth, his movements becoming increasingly assertive. <br> The whole situation@@ @@.usebtn; [[drives you crazy|GhostSpecialEventTVSpirit1]]@@ <</if>> <</linkappend>>
<<run setup.SpecialEvent.markSpiritEventStage()>> <<video "characters/ghosts/specials/spirit1.2.mp4">> @@.mc-thoughts; This goes on for a while -- someone is fucking your sweet mouth. If he were to tell you to present your ass right now, you would do it without hesitation. The thought makes your pussy@@ <<linkappend "@@.usebtn; even wetter.@@">> <<video "characters/ghosts/specials/spirit1.3.mp4">> @@.mc-thoughts; But suddenly it stops. He cums in your mouth, and you feel it spilling out. Only now do you realize what just happened--someone was fucking your mouth, and you did nothing to stop it; instead, you gave him a blowjob and ended up soaked like a slut. You want to get up and destroy this audacious intruder, but to your surprise, he's gone. Shocked by the situation, you @@@@.usebtn; [[stand up and walk away|Livingroom]]@@, @@.mc-thoughts;still trying to process what just occurred.@@<br> <br> <</linkappend>>
@@.mc-thoughts; You slowly regain consciousness, feeling a dull ache in your head. Opening your eyes, you find yourself lying on the ground in a forest. Panic sets in as you realize your hands are tightly bound with rough rope.@@<br> <<randomVideo "characters/ghosts/specials/wraith1.mp4" "characters/ghosts/specials/wraith2.mp4">> <<if setup.SpecialEvent.canTryEscape()>> @@.mc-speech; I must try to free myself from these ropes while I still have the strength, or I could be in serious trouble.@@<br> <div id="divSpecialEventReplace">@@.mc-thoughts; Every point of <<statIcon setup.StatIcon.ENERGY>> + 5% to escape@@<br><<linkreplace "@@.usebtn;Try to free myself@@ ">> <<set _escapeOk to setup.SpecialEvent.rollEscapeSuccess()>> <<if _escapeOk>> <<run setup.SpecialEvent.spendEscapeEnergy()>> <<updatemeter 'energy' `setup.Mc.energy() / setup.Mc.energyMax()`>> <<replace "#divSpecialEventReplace">> @@.mc-speech; I did it! I need to get dressed and [[go sleep home.|Sleep]]@@ <</replace>> <<else>> <<run setup.Mc.setEnergy(0)>> <<updatemeter 'energy' `setup.Mc.energy() / setup.Mc.energyMax()`>> @@.mc-thoughts; You try to free yourself, twisting and turning, but the ropes hold fast. You gave it your all, but it wasn't enough.@@<br> @@.mc-thoughts; Just as hope begins to fade, you hear the faint sound of footsteps.@@<br> <<linkreplace "@@.usebtn;Call for help@@">> <<image "characters/ghosts/specials/wraith1.jpg" { width: "100%" }>> @@.mc-speech; "Help! Please, someone, help me!"@@<br> @@.mc-thoughts; You see the silhouettes of people. Relief washes over you as they hurry toward you.@@<br> @@.notmc-speech; "Looks like we got lucky today..."@@<br> @@.notmc-speech; What happened, darling? Are you lost? Do you like walking around naked? We see that someone has already had fun with you, now it's our turn.Consider it a reward for your release.@@<br> @@.mc-thoughts; You wanted to answer that a terrible mistake had been made, but they quickly shut your mouth with your own clothes and [[started fucking you|GhostSpecialEventWraithStart]]@@ <</linkreplace>> <br> <</if>> <</linkreplace>></div> <<else>> @@.mc-thoughts; You try to free yourself, twisting and turning, but the ropes hold fast. Desperation wells up within you, and you continue to struggle, but to no avail. Just as hope begins to fade, you hear the faint sound of footsteps.@@<br> <<linkreplace "@@.usebtn;Call for help@@">> <<image "characters/ghosts/specials/wraith1.jpg" { width: "100%" }>> @@.mc-speech; "Help! Please, someone, help me!"@@<br> @@.mc-thoughts; You see the silhouettes of people. Relief washes over you as they hurry toward you.@@<br> @@.notmc-speech; "Looks like we got lucky today..."@@<br> @@.notmc-speech; What happened, darling? Are you lost? Do you like walking around naked? We see that someone has already had fun with you, now it's our turn.Consider it a reward for your release.@@<br> @@.mc-thoughts; You wanted to answer that a terrible mistake had been made, but they quickly shut your mouth with your own clothes and [[started fucking you|GhostSpecialEventWraithStart]]@@ <</linkreplace>> <</if>> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
<<video "characters/ghosts/specials/wraith6.mp4">> @@.notmc-speech; Good girl, suck it, do you like the taste of your pussy? @@<br> @@.mc-speech; Yes...~ I love it...@@<br> @@.notmc-speech; Haha, you're such a slut. <br> Well, okay, we have to go, I think you can @@<<linkappend "@@.notmc-speechLink;handle the rest yourself.@@">> <<video "characters/ghosts/specials/wraith-end.mp4">> @@.mc-thoughts; They helped you a little to untie your hands and left you naked in the forest. <br>However, now you can go [[sleep.|Sleep]] @@<br> <</linkappend>>
<<randomVideo "characters/ghosts/specials/wraith3.mp4" "characters/ghosts/specials/wraith4.mp4">> @@.notmc-speech;Do you like it, slut? I don't understand what you're moaning about.@@ <br> @@.notmc-speech;I think it's time to free@@ <<linkappend "@@.notmc-speechLink;your mouth from those rags.@@">> <<video "characters/ghosts/specials/wraith5.mp4">> @@.mc-speech; Mm~Too~ Much~ MMm~ I can't ~ AH@@<br> @@.notmc-speech; I still don't understand what you're trying to say, bitch.@@<br> @@.mc-thoughts;They continued to fuck you, humiliating you.@@<br> @@.notmc-speech; Are you crying? Don't, baby. We're almost letting you go. You want to go home, right? Show me [[with your mouth|GhostSpecialEventWraithEnd]] how much you want it.@@<br> <</linkappend>>
/% All room metadata lives in setup.Styles (see StyleController.js). These widgets are thin renderers over that data. %/ /% <<bodyBackground url>> Emit a body-background style block for the given image URL. Uses print because SugarCube does not interpolate variables inside raw style tags. %/ <<widget "bodyBackground">> <<if _args[0]>> <<print '<style>' + setup.Styles.bodyBackgroundCss(_args[0]) + '</style>'>> <</if>> <</widget>> /% <<roomBackground passageName>> Emit a body-background <style> block for a named hunt room. Silently no-ops if the passage name isn't a known room. %/ <<widget "roomBackground">> <<set _url to setup.Styles.bgUrl(_args[0])>> <<if _url>> <<bodyBackground _url>> <</if>> <</widget>> /% <<includeStyle>> Set the body background for the room the player came from. Used at the top of EventMC / StealClothes. %/ <<widget "includeStyle">> <<roomBackground `previous()`>> <</widget>> /% <<includeStyle2>> When a middle passage (FurnitureSearch) sits between the room and EventMC / StealClothes, previous() is FurnitureSearch, so reach two steps back for the room. %/ <<widget "includeStyle2">> <<if previous() is "FurnitureSearch">> <<roomBackground `previous(2)`>> <</if>> <</widget>> /% <<includeStyleEventMC>> Dark-room filter for the EventMC video. Two sources of "the room is dark": - Procedural / unified hunt: the player's current $run.lights entry is DARK (HuntController.isCurrentRoomDark). - Static-house FurnitureSearch chain: previous() is FurnitureSearch and the room two steps back is unlit. Kept for parity with legacy houses where the room state lives on setup.Rooms. %/ <<widget "includeStyleEventMC">> <<if setup.HuntController.isActive() and setup.HuntController.isCurrentRoomDark()>> <<addclass "body" "style-event-mc-dark">> <<elseif previous() is "FurnitureSearch" and setup.Styles.isDarkRoom(previous(2))>> <<addclass "body" "style-event-mc-dark">> <</if>> <</widget>> /% <<applyRoomLightClass>> Add the correct body class for the current passage (e.g. "owaissaKitchenLight" / "…Dark") and remove the opposite variant. No-op outside hunt rooms. %/ <<widget "applyRoomLightClass">> <<set _bodyClasses to setup.Styles.classesFor(passage())>> <<if _bodyClasses>> <<addclass "body.hauntedhouse" _bodyClasses.add>> <<removeclass "body.hauntedhouse" _bodyClasses.remove>> <</if>> <</widget>>
<<applyRoomLightClass>> <<include "DeliveryActiveIcon">> <<if passage() is "Wardrobe">> <<include "Piercing">> <<include "WardrobeSlots">> <</if>> <<if passage() eq "Mirror" and not setup.Tick.twinsEventFired()>> <<if setup.Gui.mirrorMakeupHasWidth()>> <<replace "#mirrorImage">><<image setup.Gui.mirrorMakeupImagePath() { width: "70%" }>><</replace>> <<else>> <<replace "#mirrorImage">><<image setup.Gui.mirrorMakeupImagePath()>><</replace>> <</if>> <</if>> <<set _done to setup.Tick.onPassageDone()>> <<if _done.goto>> <<goto _done.goto>> <</if>> <<run setup.Events.resetEventTriggered()>> <<run setup.HauntedHouses.resetStealClothesTriggered()>> <<if _done.lustChanged>> <<updatemeter 'mclust' `setup.Mc.lust().toFixed(2) / 100`>> <</if>>
<<set _go to setup.Tick.onPassageReady()>> <<if _go>> <<goto _go>> <</if>>
<<image "ui/img/witchhouse.jpg" { width: "85%" }>><br> @@.location; The Witch's House@@<br> @@.mc-thoughts; Doesn't look as scary as it sounds@@<br> <br> <<if not setup.Witch.isDayTime()>> <<if setup.Witch.canSneakInAtNight()>> @@.enterbtn; [[Use the stolen key to sneak into the house|WitchInsideNight]]@@ <<else>> @@.mc-thoughts;I don't think it's worth going to her now. I'll check in later (from 10 in the morning to midnight)@@ <</if>> <<else>> <<set _check to random(1,7)>> <<if _check eq 1>> @@.enterbtn;[[Go inside|WitchInsideMast]]<br>@@ <<else>> @@.enterbtn;[[Go inside|WitchInside]]<br>@@ <</if>> <</if>> <br> <br> @@.backbtn;[[Leave|CityMap]] @@<br> <<if previous(2) is "Witch">><<addTime 0.5>> <<elseif previous() is "CityMap">><<addTime 20>> <<else>><<addTime 0.5>><</if>>
<<image "characters/witch/sleeping.jpg" { width: "65%" }>><br> @@.mc-thoughts; The witch is lying on the bed. Her breathing is deep and calm. The blanket doesn't fully cover her body, revealing her round, juicy ass. <br>Your thoughts take over: you imagine kissing her, gently running your tongue over her wet pussy, biting her perfect ass.@@<br> <<addLust 30>> +30 <<statIcon setup.StatIcon.HEALTH>><br> <<linkreplace "@@.mc-speechLink; Lick her@@">> <<addTime 30>> <<run setup.Witch.startWitchNightCooldown()>> <<if setup.Witch.witchLateNightHour()>> <<video "characters/witch/lick-sleeping2.mp4">> @@.mc-thoughts; You can no longer restrain yourself. <br>You pressed your face to her juicy peach and begin to gently lick her pussy and ass.@@<br> @@.notmc-speech; Ah~<<= setup.Mc.name()>>, don't stop... @@<br> @@.mc-thoughts; Her pussy becomes wet, and sighs are heavy. After playing with her sweet butt, you prepare to leave. <br> Before you go, you hear her say in a quiet, satisfied voice: @@<br> @@.notmc-speech; Thank you, <<= setup.Mc.name()>>.@@<br> <<else>> <<video "characters/witch/lick-sleeping1.mp4">> @@.mc-thoughts; You can no longer restrain yourself. <br>You pressed your face to her juicy peach and begin to gently lick her pussy and ass. Her pussy becomes wet, and sighs are heavy. After playing with her sweet butt, you prepare to leave. <br> Before you go, you hear her say in a quiet, satisfied voice: @@<br> @@.notmc-speech; Thank you, <<= setup.Mc.name()>>.@@<br> <</if>> <<addLust 60>> +60 <<statIcon setup.StatIcon.HEALTH>><br> <<if setup.Mc.corruption() lt 10>> +0.2 <<statIcon setup.StatIcon.CORRUPTION>> <<run setup.Mc.addCorruption(0.2)>><br> <</if>> <</linkreplace>> <br> <br> @@.backbtn; [[Leave|Witch]]@@<br> <<done>> <<addclass ".linkselector" "disabled-link">> <</done>>
/* Persistent hunt-unlock storefront priced in ectoplasm (mL). Lists every item in setup.HuntController.shopCatalogue(). Bool unlocks (max=1) flip to "Owned" once bought; stackable unlocks (banlist slot, reroll charge) keep their buy link until the cap is hit. Banlist slots also expose a per-modifier ban toggle so the player can spend their owned slots; the toggle never charges ectoplasm. Costs are paid in mL of $ectoplasm. */ <<set _balanceLine to function () { return 'Ectoplasm: ' + setup.HuntController.ectoplasm() + ' mL'; }>> @@.location; The Witch's Ectoplasm Wares@@<br> @@.notmc-speech; Ectoplasm fetches a different sort of favor than coin does. Pick what you want.@@<br> <span class="meta-shop-balance"><<= _balanceLine()>></span><br> <br> <div id="hunt-shop-list"> <<for _item range setup.HuntController.shopCatalogue()>> <<capture _item>> <<set _owned to setup.HuntController.metaUnlock(_item.id)>> <<set _stackable to (_item.max gt 1)>> <<set _atCap to (_owned gte _item.max)>> <<set _rowId to 'hunt-shop-row-' + _item.id>> <div class="hunt-shop-row" @id="_rowId"> <b><<= _item.name>></b> <<if _stackable>> (<<= _owned>> / <<= isFinite(_item.max) ? _item.max : '∞'>>) <<elseif _atCap>> <span class="mc-action">— Owned</span> <</if>> <br> <span class="mc-thoughts"><<= _item.description>></span><br> <<if not _atCap>> <<if setup.HuntController.canAffordEctoplasm(_item.cost)>> @@.usebtn; <<link `'Buy (' + _item.cost + ' mL)'`>> <<run setup.HuntController.buyUnlock(_item.id)>> <<goto "WitchEctoplasm">> <</link>>@@ <<else>> <span class="disabled-link">Buy (<<= _item.cost>> mL — need <<= _item.cost - setup.HuntController.ectoplasm()>> more)</span> <</if>> <br> <</if>> </div> <</capture>> <</for>> </div> <<if setup.HuntController.bannedSlotsTotal() gt 0>> <br> @@.location; Modifier banlist@@<br> <span class="mc-thoughts"> Slots used: <<= setup.HuntController.bannedSlotsUsed()>> / <<= setup.HuntController.bannedSlotsTotal()>>. Banned modifiers will not appear in the run-start draft. </span><br> <div id="hunt-banlist"> <<for _mod range setup.Modifiers.draftableList()>> <<capture _mod>> <<set _isBanned to setup.HuntController.isBanned(_mod.id)>> <<set _slotsLeft to setup.HuntController.bannedSlotsRemaining()>> · <<if _isBanned>> <span class="mc-action"><<= _mod.name>></span> @@.usebtn; <<link "Unban">> <<run setup.HuntController.toggleBannedModifier(_mod.id)>> <<goto "WitchEctoplasm">> <</link>>@@ <<elseif _slotsLeft gt 0>> <<= _mod.name>> @@.usebtn; <<link "Ban">> <<run setup.HuntController.toggleBannedModifier(_mod.id)>> <<goto "WitchEctoplasm">> <</link>>@@ <<else>> <span class="disabled-link"><<= _mod.name>> (no slots free)</span> <</if>> -- @@.mc-thoughts;<<= _mod.description>>@@<br> <</capture>> <</for>> </div> <</if>> <br> @@.backbtn;[[Back|WitchInside]]@@<br>
<<image "ui/img/witch-girl.jpg" { width: "100%" }>> <br> <<if setup.Witch.isFirstVisit()>>  @@.notmc-speech;Hello, sweetheart, got lost? @@<br> @@.mc-speech;Hi, I'm <<= setup.Mc.name()>>. I was told I could get a contract here... for ghosts@@<br>  @@.notmc-speech;Are you really a ghost hunter? I wouldn't have guessed that looking at you... And how's the "interaction" with ghosts going? *She smiled* @@<br>  @@.mc-speech; Let's just say I haven't really started yet...@@<br>  @@.notmc-speech; Well, I won't discourage you, but listen to the rules carefully:<br>  First - to get a contract for a ghost, you need to come to me. I'll give you the key to the house with the ghost for a certain fee, of course. I don't want any losses.<br>  Second - you determine the type of this ghost. That's all I need for now. If you correctly determine the type of the ghost - I give you money, if not - I don't. It's that simple.<br>  Third - you have only one night to determine the type of the ghost. You won't be able to enter the house the next day with the same contract.<br>  Fourth - you can only tell me the type of the ghost once per contract. Even if you failed to determine it, you have one chance to guess it.@@<br>  @@.mc-speech; It seems I've got it...@@<br> <br>  @@.mc-thoughts; Okay, here I can get a ghost contract. It costs money. I receive a key to the house with the ghost and at night I go there. After determining the ghost, I have to return to her and name it. If I'm right - then I get money, if not, well, then no.@@<br> <br> @@.mc-action; Now you can receive contracts for identifying the type of ghost.@@ <br> <<run setup.Witch.markShopVisited()>> <<elseif not setup.Witch.isFirstVisit()>> @@.notmc-speech; Hey <<= setup.Mc.name()>>, how are you?@@<br> <<if setup.Witch.hasSuccubusEncounter() and (hasVisited("SuccubusEventTV") or hasVisited("SuccubusPCEvent")) and setup.Witch.exorcismQuestNotStarted()>> <<linkreplace "@@.usebtn; Ask about a ghost in the house@@">> @@.mc-speech; I am disturbed by someone or something in my own home! <br> Something is living in my house, sometimes it seems to possess me. This has been going on for some time.<br> I thought it would leave me alone after a while, like other ghosts, but it's not like that.@@<br> @@.notmc-speech; Hm... if this has been going on for a long time, you need an exorcism ritual. Go to a church and ask for a nun named Rain - she knows about these things.@@<br><br> @@.mc-action; You need to visit a church and ask about exorcism from a nun named Rain.@@<br><br> <<run setup.Witch.resetExorcismQuestStage()>> <</linkreplace>><br> <</if>> <<if setup.Witch.canOfferRescueQuest()>> <span class="rescueGirlsDisabled <<if !setup.Witch.rescueQuestUnlocked()>> disabled-link <</if>>"> <<linkreplace "@@.usebtn; Missing girls@@">> <<run setup.MissingWomen.resetQuestToAvailable()>> @@.notmc-speech; Oh, <<= setup.Mc.name()>>, you've come at just the right time. I can see you're getting more and more experienced with each passing day, and I've got an important task for you. My old friend, a nun named Rain from the church, needs some help<br> She told me that recently, her girls -- who, like you, are also ghost hunters--have started disappearing. She needs help finding them, and I thought you might be the one to assist her.<br>@@ @@.mc-speech; Of course, I think I can help her.@@<br> @@.notmc-speech; Great! I'll let her know you're on board. Head to the church -- I'm sure she'll find you and explain what to do next.@@<br> <br> @@.mc-action; You need to talk to Sister Rain at the church.@@<br> <</linkreplace>><<if !setup.Witch.rescueQuestUnlocked()>>@@.warningtext; (Req. lvl 4+)@@ <</if>><br></span> <</if>> <<if setup.Mc.lvl() lte 1>> @@.mc-speech; I just need to correctly identify the ghost, right?@@<br> @@.notmc-speech; Yes, as long as you're inexperienced, that's enough for you.@@ <br> @@.warningtext; (Req. lvl 2+)@@<br> <<else>> <<if setup.Witch.canOfferCursedItemQuest()>> <<linkreplace "@@.usebtn;I have a small task for you.@@">> <<run setup.Witch.startCursedItemQuest()>> @@.notmc-speech; It seems you've gained some experience and are ready for new challenges. So listen:<br> In every house with a ghost, there is a cursed object. It could be in any room. Find it and bring it to me, and I'll reward you. Deal?<br>@@ @@.mc-speech; How will I know if the object is cursed and not just an ordinary one?@@<br> @@.notmc-speech;The cursed object has a very strong aura. You'll feel it when you pick it up.@@<br> <br> @@.mc-action; I need to search the haunted house for the cursed object. It could be in any room.@@ <br> <</linkreplace>> <<elseif setup.Witch.cursedItemQuestActive()>> @@.mc-thoughts; I need to bring the witch a cursed object. It could be in any room.<br> <<elseif setup.Witch.hasCursedItemToTurnIn()>> <<linkreplace "@@.usebtn; I found the cursed object.@@">> @@.notmc-speech;Oh, thank you. Here is your reward. @@<br> <span> Money: +$30 $ </span><br> <<run setup.Witch.collectCursedItemReward()>> <<if setup.Witch.shouldAwardGwb3OnTurnIn()>> <<run setup.Witch.upgradeGwbToLvl3()>> @@.mc-action; You get a lvl 3 Ghost Writing Book @@<<image "ui/img/gwb.png" { style: "max-width:5%" }>><br> <br> @@.mc-speech; But why do you need them?@@<br> @@.notmc-speech; It's a powerful magical artifact. I think you felt just how potent it is yourself.@@ @@.mc-thoughts;<br> She ran her tongue over the toy and smiled slightly@@<br> @@.notmc-speech;And by the way, you can bring me cursed objects, and I'll pay you for them. It'll be like an additional task, apart from identifying the type of ghost.@@<br> <<else>> @@.notmc-speech;Don't forget to bring me the cursed items. I'll pay you for them.@@<br> <</if>> @@.mc-speech; Alright, extra money never hurts.@@ <</linkreplace>> <</if>> <</if>> <br> @@.mc-speech;<<linkreplace "Do you have anything for sale?">> <<goto "WitchSale">> <</linkreplace>>@@<br> @@.mc-speech;<<linkreplace "What can I get for ectoplasm?">> <<goto "WitchEctoplasm">> <</linkreplace>>@@<br> <<if setup.Witch.canAskAboutLevel3Tools()>> @@.mc-speech;<<linkreplace "Do you sell level 3 tools?">> @@.notmc-speech; <<if setup.Witch.ownsLevel3Gwb()>> <<else>>I only have a level 3 ghostwriting book, but I'm not planning to sell it yet. Also, <</if>>I know that the priest has some level 3 tool. Ask him about it@@ <<run setup.Witch.restartToolEvent()>> <</linkreplace>>@@<br> <</if>> <</if>> <<if setup.Witch.canAskAboutMonkeyPaw()>> <<linkreplace "@@.usebtn; Ask about Monkey Paw@@">> @@.notmc-speech; Oh, I see you found that in the haunted house. If you'd like to know what kinds of wishes the monkey paw can grant, I can sell you a little guide. Let's say... for $400. @@<br> @@.mc-speech; That's so expensive!!!@@<br> @@.notmc-speech; You see, it took a lot of effort to acquire it. So it's up to you to decide.@@<br> @@.mc-speech; Alright, I'll think about it for now...@@<br> @@.notmc-speech; No problem, just take a look at my wares if you decide to buy it.@@<br> <<run setup.Witch.markMonkeyPawGuideBought()>> <</linkreplace>><br> <</if>> <<if setup.Witch.canAskAboutIronclad()>> <<linkreplace "@@.usebtn; Ask about Prison 'Ironclad'@@">> <<if hasVisited("Ironclad Prison")>> @@.mc-speech; I went there, but I didn't find any paranormal activity. @@<br> <<else>> @@.mc-speech; What can you tell me about Ironclad prison? I've heard it's haunted, but I haven't been there yet. @@<br> <</if>> @@.notmc-speech; The thing is, some places have a special influence on ghosts. This includes the "Ironclad" prison. You won't be able to catch their attention unless you... fit in with the place. Perhaps you should think about how to become a part of this environment, how to make them notice you.@@<br> @@.mc-thoughts; It seems like the ghosts are drawn to those who belong to this place... A specific outfit might help me blend in. Perhaps I could find something suitable at the Mall. @@<br> <<run setup.Witch.markWardenOutfitHintOpened()>> <</linkreplace>> <</if>><br> <<if setup.Witch.canOfferWeakenQuest()>> <<linkreplace "@@.usebtn; Weaken the Ghost@@">> @@.notmc-speech;Now that you've gained experience, I'm ready to give you an extra task. I want you not only to identify the ghost but also to weaken him...@@<br> @@.mc-speech;And how do I do that?@@<br> @@.notmc-speech;Use your body to arouse him. Show who's in charge in this haunted house.@@<br> @@.mc-speech;I think I get what you mean... I'm not sure I can do it...@@<br> @@.notmc-speech;I'll pay you extra for this task.@@<br> @@.mc-speech;Okay, I'll think about it.@@<br><br> @@.mc-action; Now you can perform the witch's additional task: weaken the ghost.@@<br> <<run setup.Witch.markWeakenQuestStarted()>> <</linkreplace>> <</if>> <br><br> @@.backbtn;[[Leave|Witch]] <br>
<<randomVideo "characters/witch/1.mp4" "characters/witch/2.mp4">> @@.mc-speech;Oops, she seems a little busy, I'd better come back later@@<br> @@.mc-thoughts; She's so hot though@@<br> <<if not setup.Witch.hasStolenKey()>> @@.mc-thoughts; You see a key lying nearby, it looks like it might be for her house...@@<br> <<if setup.Witch.canStealKeyFromWitch()>> @@.usebtn;<<linkreplace "Steal the key">> <<run setup.Witch.markKeyFromWitchStolen()>> @@.mc-thoughts; Now i can enter the witch's house at night@@ <</linkreplace>>@@ <<else>> @@.mc-thoughts; I can't steal the key from her, it's wrong...@@ @@.warningtext; (Req. <<statIcon setup.StatIcon.CORRUPTION>> ≥ 3)@@ <</if>> <</if>> <br> <br> <<addLust 15>> @@.backbtn;[[Leave|Witch]] @@
<<image "characters/witch/witch-main.png" { width: "100%" }>> <br> <<if hasVisited("WitchBedroom")>> @@.mc-thoughts;You entered the witch's house using the key. The house is quiet. The door to her bedroom is slightly open, as if she was expecting you. A faint sound of breathing comes from behind the door.@@ <<else>> @@.mc-thoughts; You enter the witch's house, trying to move as quietly as possible. The room is shrouded in twilight, the air heavy, as if soaked in ancient mysteries. Occult objects are scattered everywhere -- strange dolls, darkened books with mysterious symbols, candles flickering with a dim light. You feel the gaze of invisible eyes watching your every step.<br> Your attention is drawn to a slightly open door at the back of the room. It looks like a bedroom. A faint sound of breathing comes from behind the door. She's probably asleep.@@ <</if>> <br> <<if setup.Witch.canStealItemsFromWitch()>> <<linkreplace "@@.usebtn;Look for something useful@@">> <<run setup.Witch.startStealItemsCooldown()>> <<set _check to random(1,5)>> @@.mc-speech; <<if _check eq 1>> <<if not setup.Ghosts.hasDiscovered("Myling")>> <<run setup.Ghosts.markDiscovered("Myling")>> You found information about the ghost Myling <<else>> You found 30$ <<run setup.Mc.addMoney(30)>> <</if>> <<elseif _check eq 2>> You didn't find anything <<elseif _check eq 3>> You found sanity pillls! <<run setup.Mc.addSanityPills(1)>> <<elseif _check eq 4>> You found a crusifix! <<run setup.ToolController.addCrucifix()>> <<elseif _check eq 5>> <<goto "WitchTentaclesEvent">> <</if>> @@ <</linkreplace>> <<else>> @@.mc-speech; Enough stealing for today.@@ <</if>> <br> <<if not setup.Witch.canVisitWitchBedroomNight()>> @@.mc-speech; Enough for today.@@ <<else>> @@.enterbtn; [[Bedroom|WitchBedroom]]@@ <</if>> <br> <br> @@.backbtn; [[Leave|Witch]]@@<br>
<div class="flexwrapper"> <div class="housecard"> <<image "ui/img/sanity-pills.png" "iconPx">><br> <span class="priceAmount">10$</span><br> <<if setup.Mc.money() gte 10>> @@.buyItemLink;<<link "Buy" "WitchSale">> <<run setup.Mc.addSanityPills(1)>> <<run setup.Mc.removeMoney(10)>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <span class="subtitleAmount">@@.mc-thoughts; You have <<= setup.Mc.sanityPillsAmount()>> sanity pills@@</span> </div> <div class="housecard"> <<run setup.ToolController.initCrucifixIfNeeded()>> <<image "ui/img/crucifix.webp" "iconPx">><br> <span class="priceAmount">10$</span><br> <<if setup.Mc.money() gte 10>> @@.buyItemLink;<<link "Buy" "WitchSale">> <<run setup.ToolController.addCrucifix()>> <<run setup.Mc.removeMoney(10)>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <span class="subtitleAmount">@@.mc-thoughts; You have <<= setup.ToolController.crucifixAmount()>> crucifix@@</span> </div> <div class="housecard"> <<if setup.Witch.toolLevel("emf") eq 5>> <<image "ui/img/emf.png" "iconPx">><br> <span class="priceAmount">200$</span><br> <<if setup.Mc.money() gte 200>> @@.buyItemLink;<<link "Buy (lvl 2)" "WitchSale">> <<run setup.Witch.upgradeTool("emf")>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> <<if setup.Witch.toolLevel("temperature") eq 5>> <<image "ui/img/thermometr.png" "iconPx">><br> <span class="priceAmount">100$</span><br> <<if setup.Mc.money() gte 100>> @@.buyItemLink;<<link "Buy (lvl 2)" "WitchSale">> <<run setup.Witch.upgradeTool("temperature")>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> <<if setup.Witch.toolLevel("spiritbox") eq 5>> <<image "ui/img/spiritbox.png" "iconPx">><br> <span class="priceAmount">500$</span><br> <<if setup.Mc.money() gte 500>> @@.buyItemLink;<<link "Buy (lvl 2)" "WitchSale">> <<run setup.Witch.upgradeTool("spiritbox")>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> <<if setup.Witch.toolLevel("gwb") eq 5>> <<image "ui/img/gwb.png" "iconPx">><br> <span class="priceAmount">400$</span><br> <<if setup.Mc.money() gte 400>> @@.buyItemLink;<<link "Buy (lvl 2)" "WitchSale">> <<run setup.Witch.upgradeTool("gwb")>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> <<if setup.Witch.toolLevel("glass") eq 5>> <<image "ui/img/glass.png" "iconPx">><br> <span class="priceAmount">300$</span><br> <<if setup.Mc.money() gte 300>> @@.buyItemLink;<<link "Buy (lvl 2)" "WitchSale">> <<run setup.Witch.upgradeTool("glass")>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> <<if setup.Witch.toolLevel("uvl") eq 5>> <<image "ui/img/uvl.png" "iconPx">><br> <span class="priceAmount">400$</span><br> <<if setup.Mc.money() gte 400>> @@.buyItemLink;<<link "Buy (lvl 2)" "WitchSale">> <<run setup.Witch.upgradeTool("uvl")>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> <<if setup.MonkeyPaw.isGuideAsked()>> <<image "mechanics/cursedpossessions/monkey-paw/monkeypaw-page.jpg" "iconPx">><br> <span class="priceAmount">400$</span><br> <<if setup.Mc.money() gte 400>> @@.buyItemLink;<<link "Buy" "WitchSale">> <<run setup.Witch.unlockMonkeyPawWishes()>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> <<if not setup.Witch.detectorBought()>> <<image "ui/img/detector.png" "iconPx">><br> <span class="priceAmount">200$</span><br> <<if setup.Mc.money() gte 200>> @@.buyItemLink;<<link "Buy" "WitchSale">> <<run setup.Witch.buyDetector()>> <</link>>@@<br> <<else>>@@.mc-thoughts; I don't have enough money@@ <</if>> <</if>> </div> <div class="housecard"> </div> <div class="housecard"> </div> <<ghostInfoCard "Jinn">> <<ghostInfoCard "Deogen">> <<ghostInfoCard "Demon">> <<ghostInfoCard "Phantom">> <<ghostInfoCard "Shade">> <<ghostInfoCard "Goryo">> <<ghostInfoCard "Oni">> <<ghostInfoCard "Myling">> <<ghostInfoCard "Spirit">> <<ghostInfoCard "Cthulion">> <<ghostInfoCard "Banshee">> <<ghostInfoCard "Moroi">> <<ghostInfoCard "Wraith">> <<ghostInfoCard "Raiju">> </div> <br> @@.backbtn;[[Back|WitchInside]]@@ <br>
<<image "mechanics/tentacles/witch-t.jpg" { width: "100%" }>><br> @@.mc-thoughts; You tried to steal it, but suddenly, tentacles emerged from the darkness, instantly wrapping around your body and tying you to the chair.<br> One tentacle coiled around your neck, slightly constricting, forcing you to hold your breath, while another, slippery and insistent, slithered to your pussy, beginning to @@ <<linkappend "@@.usebtn; fuck you mercilessly.@@">> <<video "mechanics/tentacles/witch-t1.mp4">> @@.mc-thoughts; You feel it penetrate deeply, its movements growing more intense until the tentacle inside your pussy climaxes, filling you with its thick,@@ <<linkappend "@@.usebtn; warm cum@@">> <<video "mechanics/tentacles/witch-t2.mp4">> @@.mc-thoughts; After that, the cum starts to leak from your pussy, the tentacles loosen their grip and vanish. You try to escape the house, hoping the tentacles won't come back.@@<br><br> @@.backbtn; [[Continue|Witch]]@@ <<if setup.Witch.spend2HoursHandleMidnight()>><<run setup.Tick.resetCooldowns()>><</if>> <</linkappend>> <</linkappend>>
<<widget "ghostTypeDropdown">> /* Wraps SugarCube's <<listbox>> UI binding for $ghostTypeSelected. Passages call <<ghostTypeDropdown>> instead of naming the global. */ <<listbox "$ghostTypeSelected">> <<optionsfrom setup.Ghosts.names()>> <</listbox>> <</widget>> <<widget "ghostInfoCard">> <<set _ghostName to _args[0]>> <<set _price to (typeof _args[1] !== "undefined") ? _args[1] : 200>> <div class="housecard"> <<if not setup.Ghosts.hasDiscovered(_ghostName)>> <<image "characters/ghosts/" + _ghostName.toLowerCase() + ".webp" "iconPx">> @@.mc-thoughts; Information about _ghostName@@<br> <span class="priceAmount"><<= _price>>$</span><br> <<if setup.Mc.money() gte _price>> /* <<capture>> snapshots _ghostName/_price into the link's payload — without it, the link's <<run>> callback fires after the widget exits and reads whatever values the *last* ghostInfoCard invocation left in temp scope (so every Buy click marked the last-rendered ghost as discovered). */ <<capture _ghostName, _price>> @@.buyItemLink;<<link "Buy" "WitchSale">> <<run setup.Ghosts.markDiscovered(_ghostName)>> <<run setup.Mc.removeMoney(_price)>> <</link>>@@<br> <</capture>> <<else>>@@.warningtext; I don't have enough money@@ <</if>> <</if>> </div> <</widget>>